$str = 'XXXXjava6java7XXXX'; $perg = "/java(?=6|7)/"; preg_match_all($perg, $str, $matchs); $str1 = preg_replace($perg, '\0', $str); //"XXXXjava6java7XXXX" var_dump($matchs, $str1); die;
输出结果:
array(1) { [0]=> array(2) { [0]=> string(4) "java" [1]=> string(4) "java" } } string(18) "XXXXjava6java7XXXX"
相比上面的我们匹配的结果中没有 6,7
PHP正向不匹配实例
$str = 'XXXXjava6java7XXXX'; $perg = "/java(?!6)/"; //不匹配java6 preg_match_all($perg, $str, $matchs); $str1 = preg_replace($perg, '', $str); //"XXXXjava67XXXX" var_dump($matchs, $str1); die;
输出结果:
array(1) { [0]=> array(1) { [0]=> string(4) "java" } } string(14) "XXXXjava67XXXX"
这里匹配的到结果是java7,但是由于我们用了非获取匹配,就不存贮7,剩下的就是java了
主要:不管是怎么替换,如果我们只要用的是 \0(完整匹配结果) 中的结果进行替换,相当于匹配到了什么就替换掉原字符串中的什么,实际上原字符串没变化,
二 . 反向预查
(?<=pattern) 反向匹配。(?<=J)a,匹配紧跟字母J后面的a,结果Java6 Java
(?<!pattern) 反向不匹配。(?<!J)a,不匹配紧跟字母J后面的a,结果Java6 Java
PHP反向预查实例
$str = 'XXXXjava6java7XXXX'; $perg = "/(?<!6)java/"; //不匹配前端有6的java preg_match_all($perg, $str, $matchs); $str1 = preg_replace($perg, '', $str); //"XXXX6java7XXXX" var_dump($matchs, $str1); die;
输出结果:
array(1) { [0]=> array(1) { [0]=> string(4) "java" } } string(14) "XXXX6java7XXXX"
总结:
正向预查,反向预查,就是方向不同。
正向预查时,具体字符串在左边,/java(?:6|7)/,从字符串开始向右查找;
反向则在右边: / (?<!J)a /,从字符串向反方向(左)查找。
更多关于PHP正则使用技巧请查看下面的相关链接