php中Warning: preg_match_all(): Compilation failed: lookbehind assertion

今天在测试正则表达式中相关环视的代码时,发现有个错误
错误信息如下:
Warning: preg_match_all(): Compilation failed: lookbehind assertion is not fixed length at offset
代码如下:

1
2
3
$str='<div>info</div><b>strong</b>';
preg_match_all('/(?<=<(\w+)[^>]*>).*(?=<\/\1>)/',$str,$match);
var_dump($match);

执行上面的代码就会报错,在网上查看下,说php中逆序环视(包括逆序肯定环视 ?<=exp、逆序否定环视 ?<!exp )中不支持不固定宽的正则式,需要固定宽度,即不能用+、*、{1,}等表示。肯定环视没有这个问题
将上面的代码改为:

1
2
3
$str='<div>info</div><b>strong</b>';
preg_match_all('/(?<=<(\w)>).*(?=<\/\1>)/',$str,$match);
var_dump($match);

但这种只能匹配b标签中strong内容
其实,不用环视来匹配,直接用分组来捕获内容,只是这样要在返回的结果中筛选一下

1
2
3
$str='<div>info</div><b>strong</b>';
preg_match_all('/(<(\w+)[^>]*>)(.*)(<\/\2>)/',$str,$match);
print_r($match[3]);//Array ( [0] => info [1] => strong )

打赏此文

如果您觉得本站的内容对您有所帮助,您可以扫描下面的二维码小额支付请我喝杯茶,感谢!打赏记录
支付宝
微信
承诺:凡打赏捐助的朋友,留言备注自己的邮箱,在打赏捐助时间点的6个月内,本站会每周邮件推送原创专业技术博文,供大家学习和参考!

留下评论

All fields marked (*) are required