You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 13:13:07