代码如下:$str = "好好好.ccccc..vvvv吃吃asdsdfasdaAaaaaaaaaabbbbbbbcbbbbbbbbbbbbbaaaaaaaaa啊啊啊啊";echo preg_replace("/(.)\\1+/i", "$1", $str);我要的结果是:好.c.v吃吃fasdabcba啊可是现在的结果:好好好.c.v吃吃asdsdfasdabcba啊啊啊啊正则 /(.)\1+/ 在Javascript下却又可以得到我想要的结果呢。PHP正则去掉重复字符,得不到我要的结果?

解决方案 »

  1.   

    因为对于javascript来说没有编码的概念,都是unicode,而php中有编码的概念,如果有非ascii码的字符内容,你就要在正则中考虑编码的问题// 汉字是gbk
    echo preg_replace("/[".chr(0xa1)."-".chr(0xff)."]|.)\\1+/i", "$1", $str);// 汉字是utf8
    echo preg_replace("/[\x{4e00}-\x{9fa5}]|.)\\1+/iu", "$1", $str);
      

  2.   

    上面的未经测试,这次给你测试过的答案,少加了一个括号,和汉字的2个编码修正
    // 汉字是gbk
    echo preg_replace("/([\x80-\xff]?.)\\1+/i", "$1", $str);// 汉字是utf8
    echo preg_replace("/([\x{4e00}-\x{9fa5}]|.)\\1+/iu", "$1", $str);
      

  3.   

    谢谢楼上的朋友。如果不分 编码 是否都转成 UTF8编码即可统一处理??
      

  4.   

    例如 
    $str = iconv("GBK", "UTF-8", $str);
    或者
    $str = mb_convert_encoding($str, "UTF-8", "GBK");