RegEx: Остерегайтесь, чтобы избежать нечетного числа последовательных обратных слешей
У меня есть пользовательский ввод, где некоторые теги разрешены в квадратных скобках. Я уже написал шаблон регулярных выражений, чтобы найти и проверить, что находится в скобках.
В поле ввода пользователя открывающая скобка может ([) быть экранирована с помощью обратной косой черты, а также может быть экранирована обратной косой чертой (\). Мне нужен вспомогательный шаблон, чтобы избежать нечетного числа последовательных обратных косых черт перед открывающей скобкой.
На данный момент я должен иметь дело с чем-то вроде этого:
(?<!\\)(?:\\\\)*\[(?<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 ответа
В прошлый раз, когда я проверял, PHP не поддерживал видоискатели переменной длины. Вот почему вы не можете использовать тривиальное решение (?<*\\)
,
Самый простой обходной путь - просто сопоставить всю вещь, а не только часть скобок:
(?<!\\)((?:\\\\)*)\[(?<inside_brackets>.*?)]
Разница в том, что теперь, если вы используете это регулярное выражение в preg_replace
, вы должны помнить префикс строки замены $1
, чтобы восстановить обратные слеши, находящиеся там.
Вы можете сделать это без каких-либо оглядки назад ((\\\\|[^\\])
чередование кушает все что угодно, кроме одной косой черты):
^(\\\\|[^\\])*\[(?<brackets>.*?)\]