您的位置:首页 > 其它

【正则表达式 提高】环视,中文字处理

2013-06-03 04:00 246 查看
在正则规范中,我们可能会看到(?: 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>";
?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: