11

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

在用户输入字段中,左括号([)可以用反斜杠转义,反斜杠也可以用另一个反斜杠(\)转义。我需要后视子模式以避免在打开括号之前出现奇数个连续反斜杠。

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

(?<!\\)(?:\\\\)*\[(?<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

4

2 回答 2

11

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

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

(?<!\\)((?:\\\\)*)\[(?<inside_brackets>.*?)]

不同之处在于,现在,如果您在 a 中使用该正则表达式preg_replace,您必须记住为替换字符串添加前缀$1,以恢复存在的反斜杠。

于 2012-03-08T06:42:31.950 回答
0

你可以在没有任何后视的情况下做到这一点(交替吃除了一个反斜杠之外的任何东西(\\\\|[^\\])

^(\\\\|[^\\])*\[(?<brackets>.*?)\] 
于 2012-03-08T10:29:33.640 回答