我有用户输入,方括号内允许一些标签。我已经编写了正则表达式模式来查找和验证括号内的内容。
在用户输入字段中,open-bracket可以([)使用反斜杠进行转义,也可以使用另一个反斜杠(\)转义反斜杠。我需要后视子模式以避免在open-bracket之前连续反斜杠的数量。
目前我必须处理这样的事情:
(?<!\\)(?:\\\\)*\[(?<inside brackets>.*?)]
它运行正常,但问题是此代码仍然匹配括号前面可能的连续反斜杠对(即使它们是隐藏的),并且后面只检查是否有另外一个反斜杠附加到对(或直接打开) -托架)。如果可能的话,我需要在后视组内避免它们。
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
我使用PHP PCRE
答案 0 :(得分:11)
上次我查看时,PHP不支持可变长度的lookbehinds。这就是为什么你不能使用简单的解决方案(?<![^\\](?:\\\\)*\\)
。
最简单的解决方法是简单地匹配整个事物,而不仅仅是括号部分:
(?<!\\)((?:\\\\)*)\[(?<inside_brackets>.*?)]
不同之处在于,现在,如果你在preg_replace
中使用该正则表达式,你必须记住用$1
替换字符串前缀,以恢复那里的反斜杠。
答案 1 :(得分:0)
你可以在没有任何后视的情况下做到这一点( (\\\\|[^\\])
交替只吃一个反斜杠):
^(\\\\|[^\\])*\[(?<brackets>.*?)\]