用正则表达式去解决结巴这个问题可以通过下面进行解决:
解决思路是:
- 先找到重复的不部分
- 用str_replace($source,$replace,$str);来进行代理
下面分两种情况,最后将这两种情况进行合一处理
1,针对aaabbbccc...ddd...ffafawefafdaddd这样的字符串,去重可以使用下面的方法


1 $str1="aaabbbccc...ddd...ffafawefafdaddd"; 2 $reg1 = '/(.)\1+/'; //这里\1表示括号内的第一个表达式的值 3 $str2 = str_replace('.','',$str1); 4 preg_match_all($reg1,$str2,$rst); 5 $str3=str_replace($rst[0],$rst[1],$str2);
2,针对含有汉语字符的,比如说"我我...是是....一个个个个个个...帅哥哥哥哥哥",去重可以采用下面方法


1 $str11 = "我我...是是....一个个个个个个...帅哥哥哥哥哥"; 2 $str12 = str_replace('.','',$str11); 3 $reg11 = '/([\x{4e00}-\x{9fa5}])\1+/u'; //u表示utf编码 4 preg_match_all($reg11,$str12,$rst); 5 $rst12 = str_replace($rst[0],$rst[1],$str12); 6 echo $rst12;
最后,将两种情况进行合并,并封装成一个方法:


1 /* 2 说明,去除$str中重复的字符 3 */ 4 function getRealString($str){ 5 $str1 = str_replace('.','',$str); 6 //注意,这里的\1表示第一个表达式的值,是第一个大括号的值,所以可以是英文或者汉语 7 //注意汉语的编码范围是0x4e00-0x9fa5; 后面u表示按照utf编码 8 //?:表示非获取型匹配,也就是说返回的$rst里不会出现此表达式的值 9 $reg1 = '/([\x{4e00}-\x{9fa5}]|(?:.))\1+/u'; 10 preg_match_all($reg1,$str1,$rst); 11 return str_replace($rst[0],$rst[1],$str1); 12 }
总结一下,上面的程序主要是考察了对正则表达式的理解以及数组的函数的使用