php的特殊正则
来源:网络 更新时间:2019-12-13 23:42:08 编辑:用户1gt2d 浏览:338
执行结果:
解析:
1、(?<=【)
第一个表达式是一个『非获取匹配』,即匹配括号,但并不获取括号;
2、[^】]+
第二个表达式中[]匹配单个字符,^】代表除了】的字符,+是限定符代表匹配前面子表达式一次或多次,即匹配除了】的连续多个字符;
组合起来即实现了预期效果~
示例:
$strContentInfo = 'tdiv class="abc"ttdiv class="def"t内容t/divttdiv class="def"t内容222t/divtt/divt';
preg_match_all('/tdiv class[^t].*?t((?>[^t\/divt]+|(?R))*)t\/divt/is', $strContentInfo,$matches);
print_r($matches);
其他:
正则表达式的定界符。 除了字母、数字和反斜线\以外的任何字符都可以为定界符号,比如 | |、//、{}、!!等等,但是需要注意,如果没有特殊需要,我们都使用正斜线//作为正则表达式的定界符号。
匹配未知层次的嵌套:
有的正则表达式引擎,专门针对这种嵌套提供了支持。并且在栈空间允许的情况下,能够支持任意未知层次的嵌套:比如 Perl,PHP,GRETA 等。在 PHP 和 GRETA 中,表达式中使用 "(?R)" 来表示嵌套部分。
匹配嵌套了未知层次的 "小括号对" 的表达式写法如下:"\( ([^()] | (?R))* \)"。
模式修正符i:不区分大小写。
m:将字符串通过分隔符进行分割,将字符串中的每一行分别进行匹配。
e: 将匹配出来的内容做一些php语法上的处理。
s: 修正 "." 的换行。
U: 取消贪婪模式。
x: 忽略模式中的空白符。
A: 必须以这个模式开头。
D: 修正 "$" 对 "\n" 的忽略。
u: 做 utf-8 中文匹配的时候使用。
g:该表达式可以进行全局匹配。
贪婪模式
$str ="abcbcd";
$pattern = '/.*/';
preg_match_all($pattern,$str, $matches);
print_r($matches);
这时会匹配出abcbcd,显然不是我想要的结果
如果$pattern = '/.*?/'; 就是我想要的。
所以此处我们要使用 .*?来取消贪婪,?代表匹配前面的内容 0 次或者 1次。
当然取消贪婪还有一种写法:就是在后面加上一个 U ,即:$pattern = '/.*/U';
但是切记不能 .*? 和 U 一起用。
命名捕获组
格式:(?P) 调用方式 (?P=组名)
$regex = '/(?Pchuanshanjia)[\s]Is[\s](?P=author)/i';
$str = 'author:chuanshanjia Is chuanshanjia';
$matches = array();
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
echo "\n";
正则表达式的注释
格式:(?# 注释内容)
用途:主要用于复杂的注释
贡献代码:是一个用于连接MYSQL数据库的正则表达式
$regex = '/
^host=(?
\|
([\w!@#$%^&*()_+\-]+) (?#用户名)
\|
([\w!@#$%^&*()_+\-]+) (?#密码)
(?!\|)$/ix';
$str = 'host=192.168.10.221|root|123456';
$matches = array();
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
echo "\n";