RegEx: Остерегайтесь, чтобы избежать нечетного числа последовательных обратных слешей - PullRequest
10 голосов
/ 08 марта 2012

У меня есть пользовательский ввод, где некоторые теги разрешены в квадратных скобках. Я уже написал шаблон регулярных выражений, чтобы найти и проверить, что находится в скобках.

В поле ввода пользователя открывающая скобка может ([) быть экранирована с помощью обратной косой черты, а также может быть экранирована обратной косой чертой (\). Мне нужен вспомогательный шаблон, чтобы избежать нечетного числа последовательных обратных косых черт перед открывающей скобкой.

На данный момент я должен иметь дело с чем-то вроде этого:

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

Ответы [ 2 ]

11 голосов
/ 08 марта 2012

В прошлый раз, когда я проверял, PHP не поддерживает вид сзади переменной длины.Вот почему вы не можете использовать тривиальное решение (?<![^\\](?:\\\\)*\\).

Самый простой обходной путь - просто сопоставить всю вещь, а не только часть скобок:

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

Разница в том, чтотеперь, если вы используете это регулярное выражение в preg_replace, вы должны помнить, чтобы префикс строки замены был $1, чтобы восстановить находящиеся там обратные слеши.

0 голосов
/ 08 марта 2012

Вы могли бы сделать это вообще без каких-либо предварительных проверок ( чередование (\\\\|[^\\]) съедает все, кроме одной обратной косой черты ):

^(\\\\|[^\\])*\[(?<brackets>.*?)\] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...