正则表达式的后向引用,模式与预查
引用百度百科对正则的解释如下:
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);
2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。
正则表达式的特点是:
1. 灵活性、逻辑性和功能性非常的强;
2. 可以迅速地用极简单的方式达到字符串的复杂控制。
3. 对于刚接触的人来说,比较晦涩难懂。
正则方面的知识很多地方都有,此文就不在基础方面做介绍了,主要介绍一下正则应用中的后向引用,模式与预查这类比较难懂的地方.
后向引用
后向引用最有用的应用是提供了确定文字中连续出现两个相同单词的位置的能力,如下例子
找出其中首位相同的单词:
$str = "txt hello high bom num"; $pattern = "/\bt\w+t\b/"; //此正则可以找出 txt ,但是其他单词也有首尾字母一样的就无能为力了
此时就要用到后向引用
$pattern = "/\b([a-zA-Z])\w+\1\b/"; //此次正则就可以完美匹配收尾字母一样的单词
这里使用\1来对前面的自表达式括号里的匹配的内容重复匹配(有些地方使用$1,例如 unix 系统)
如果有多个自表达式,那么后面将用\2,\3…以此类推
在这里举一个应用小例子
//将手机号中间 4 位用*替代; $number = "13395019910 , 13899010180"; $pattern = "/(\d{3})\d{4}(\d{4})/"; $str = preg_replace($pattern,"\1****\2",$number); echo $str; //输出 : 133****9910 , 138****0180
模式
i 模式(不区分大小写):
正则表达式默认是区分大小写的,如果需要获取不区分大小写的单词,可以使用 i 模式
只需要在正则表达式后面的/替换为/i
$str = 'hello WORLD, ChINa'; //$patt = '/\b[a-z]+\b/'; 只能匹配出 hello $patt = '/\b[a-z]+\b/i'; //全部都能匹配到 preg_match_all($patt, $str, $matches); print_r($matches);
单行模式(s):
单行模式就是把整个字符串当成一行
使用.+来匹配遇到换行符就会结束,
我们使用单行模式就可以解决这个问题
通常在匹配 html 标签的时候用到单行模式
与 i 模式一样的,只需要在正则表达式后面的/替换为/s
u 模式:
u 模式,把传入的参数看成是 unicode 字符集的编码,可以判断中文
$patt = '/^[\x{4e00}-\x{9fa5}]+$/u';
比如以上正则可以检测字符串是否全部由中文组成.
预查
//把 ing 结尾的单词词根部分(即不含 ing 部分)找出来 $str = 'hello ,when i am working , don not coming'; //零宽度,正预测,前瞻,断言 //$patt = '/\b(\w+)ing\b/'; //$patt = '/\b\w+(?=ing)\b/'; //语义矛盾,没有谁是以 ing 结尾,同时又是单词结尾 $patt = '/\b\w+(?=ing\b)/'; preg_match_all($patt, $str, $matches); print_r($matches); //把不是 ing 结尾的单词找出来 //零宽度,负预测,前瞻,断言 $patt = '/\b\w+(?!ing)\w{3}\b/'; preg_match_all($patt, $str, $matches); print_r($matches); //把以 un 开头的单词找出来 //零宽度,正预测,回顾,断言 $str = 'luck ,unlucky, state , unhappy'; $patt = '/(?<=\bun)\w+\b/'; preg_match_all($patt, $str, $matches); print_r($matches); //把非 un 开头的单词找出来 //零宽度,负预测,回顾,断言 $patt = '/\b\w{2}(?<!un)\w*\b/'; preg_match_all($patt, $str, $matches); print_r($matches);