PHP正则表达式匹配未被转义的+号间内容的问题
PHP正则表达式匹配未被转义的+号间内容的问题
嘿,我来帮你搞定这个正则匹配的难题!你想要抓取两个未被反斜杠转义的+号之间的内容,同时跳过那些带转义的\+场景,对吧?
先说说你之前用的正则/\+(.*?)\+/的问题:这个表达式会把所有+都当作分隔符,不管它前面有没有转义的反斜杠,所以才会错误把\+里的+也当成匹配边界,导致结果不符合预期。
解决方案:带负向断言的正则表达式
我们需要用负向回顾断言来排除被转义的+,同时考虑到反斜杠自身被转义的情况(比如\\+里的+其实是未被转义的,因为前面的\是转义自身的)。
下面这个正则就可以满足你的需求:
$pattern = '/(?<!\\)(?:\\\\)*\+(.*?)(?<!\\)(?:\\\\)*\+/s';
正则各部分解析
(?<!\\):负向回顾断言,确保当前位置前面不是单个未被转义的反斜杠(?:\\\\)*:匹配0个或多组成对的反斜杠(也就是被转义的反斜杠,对应实际文本中的单个反斜杠)\+:作为匹配的起始/结束分隔符(.*?):非贪婪模式匹配两个+之间的内容,s修饰符让.可以匹配换行符(如果你的文本里没有换行,也可以去掉这个修饰符)
完整PHP代码示例
$str = 'GroupNo+ \+ +Name+ / +Ac'; preg_match_all('/(?<!\\)(?:\\\\)*\+(.*?)(?<!\\)(?:\\\\)*\+/s', $str, $matches); // 输出匹配到的内容 print_r($matches[1]);
运行这段代码后,你会得到期望的结果:
Array ( [0] => \\+ [1] => / )
内容来源于stack exchange
相关产品推荐
相关产品推荐

