【正则表达式 提高】环视,中文字处理
在正则规范中,我们可能会看到(?: pattern), (?!pattern ) (?<! pattern) (?<=pattern), (?=pattern),这些叫做环视。
(?: pattern): 非捕获匹配, 说白了就是系统不会捕获这个子表达式
(?!pattern): 顺序否定环视,表示所在位置右侧不能匹配Expression
举例:(?!\|), 表示在这个位置的右侧不能出现 | , 如果出现 | 则不会匹配。
(?=pattern): 顺序肯定环视, 表示所在位置的右侧能够匹配Expression
(?<! pattern) :逆序否定环视, 表示所在位置左侧不能匹配Expression
(?<=pattern): 逆序肯定环视, 表示所在位置左侧能够匹配Expression
//环视的举例 $regex = '/
^host = (?<!\.)([\d.]+)(?!\.) (?#主机地址) \| ([\w!@#$%^&/*()_-+\]) (?#用户名) \| ([\w!@#$%^&*()_+\-]) (?#密码) (?!\|)$ /ix'; |
\x: 可以匹配中文字符
下面的程序是查找一段string中有多少中文字,有多少数字和字母。
/[\x{4e00}-\x{9fa5}]/iu
<?php //查找出游多少个汉字,多少个英文字母,多少数字 $str = "awefawe66565awefaw文字母ef"; //汉字按utf-8编码来说,它的范围是多少? 16进制 \x4e00-\x9fa5 $reg1 = '/[\x{4e00}-\x{9fa5}]/iu'; //u is utf-8 //{}: ground char form one pattern preg_match_all($reg1, $str, $res); echo "There are ".count($res[0])." Chinese letters"; echo "<pre>"; print_r($res); echo "</pre>"; //a-zA-Z $reg2 = '/[a-zA-Z]/i'; preg_match_all($reg2, $str, $res); echo "There are ".count($res[0])." Chinese letters"; echo "<pre>"; print_r($res); echo "</pre>"; //0-9 $reg3 = '/[0-9]/i'; preg_match_all($reg3, $str, $res); echo "There are ".count($res[0])." Chinese letters"; echo "<pre>"; print_r($res); echo "</pre>";
题:结巴程序
我给出一个字符串,“我要要学学学...php”把他换成"我要学php"
<?php $str = "我要要学学学...php"; //查找连续出现的相同中文字,并去匹配所有 $reg4 = '/([\x{4e00}-\x{9fa5}])\1+/iu'; preg_match_all($reg4, $str, $res); /* Array ( [0] => Array ( [0] => 要要 [1] => 学学学 ) [1] => Array ( [0] => 要 [1] => 学 ) ) */ //单独提取出res[1]中的内容作为replacement和pattern去替换str中的内容 for($i = 0; $i < count($res[1]); $i++){ $pattern = '/('.$res[1][$i].')\1+/iu'; $replacement = $res[1][$i]; $str = preg_replace($pattern, $replacement, $str); }//除去了所有结巴的中文字 //除去... //...出现的次数必须大于或者等于2次 $reg5 = '/(\.)\1+/i'; $str = preg_replace($reg5, '', $str); echo "<pre>"; print_r($str); echo "</pre>"; ?>