RegEx:Look-behind避免奇数个连续反斜杠

Wh1*_*Ck5 10 php regex pcre negative-lookbehind lookbehind

我有用户输入,方括号内允许一些标签.我已经编写了正则表达式模式来查找和验证括号内的内容.

在用户输入字段中,开启括号可以([)使用反斜杠进行转义,也可以使用另一个反斜杠(\)转义反斜杠.我需要后视子模式以避免在开括号之前奇数个连续的反斜杠.

目前我必须处理这样的事情:

(?<!\\)(?:\\\\)*\[(?<inside brackets>.*?)]
Run Code Online (Sandbox Code Playgroud)

它工作正常,但问题是这个代码仍然匹配括号前面可能的连续反斜杠对(即使它们是隐藏的),并且后面只检查是否有另外一个反斜杠附加到对(或直接到开括号) .如果可能的话,我需要在后视组内避免它们.

例:

my [test] string is ok
my \[test] string is wrong
my \\[test] string is ok
my \\\[test] string is wrong
my \\\\[test] string is ok
my \\\\\[test] string is wrong
...
etc
Run Code Online (Sandbox Code Playgroud)

我使用PHP PCRE

Eti*_*rot 11

上次我检查时,PHP不支持可变长度的lookbehinds.这就是为什么你不能使用琐碎的解决方案(?<![^\\](?:\\\\)*\\).

最简单的解决方法是简单地匹配整个事物,而不仅仅是括号部分:

(?<!\\)((?:\\\\)*)\[(?<inside_brackets>.*?)]
Run Code Online (Sandbox Code Playgroud)

不同的是,现在,如果你在a中使用那个正则表达式preg_replace,你必须记住用替换字符串作为前缀$1,以恢复那里的反斜杠.