Как сделать, чтобы второе совпадение с регулярным выражением имело приоритет? - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь сопоставить переменную PHP в запросе MySQL, но по какой-то причине я все еще собираю конечную кавычку ("), которая завершает запрос. Проблема в том, что я не могу просто исключить кавычки, потому что мне нужно разрешить массивы.

Регулярное выражение: /(?:where)?.*[.| ](?<phrase>(?<col>[a-z_]+).*?(?<opp>=|in)[\s(]*?["'\s.{]+(?<var>\$[^\s;}]+)["'\s.]*)(?<end>.*)/i

Строка: $sql = "SELECT name FROM user WHERE id = $uuid";

Желаемое совпадение:

  • «фраза» - id = $uuid (фактическое совпадение: id = $uuid")
    • "col" - id
    • "OPP" - =
    • "var" - $uuid (фактическое совпадение: $uuid")
  • "конец" - "; (фактическое совпадение: ;)

Regex 101

Я включил в ссылку массив, чтобы показать, что я имею в виду. И этот соответствует правильно. Но я не могу понять, как сопоставить запрос $uuid, не нарушая запрос array. Проблема, с которой я сталкиваюсь, заключается в том, что все, что исправляет запрос $uuid, перемещает совпадение в запросе array с $_REQUEST["user-id"] на $_REQUEST["user-id.

Есть ли способ указать регулярному выражению, что оно не соответствует закрывающей кавычке (если она существует), если оно не является частью параметра массива?

Как можно лучше понять, мне нужно, чтобы группа <end> имела приоритет над группой <phrase> при сопоставлении кавычек, но я не могу понять, как.

1 Ответ

2 голосов
/ 13 мая 2019

Вы можете изменить 2 вещи в вашем шаблоне. Вы можете добавить двойную кавычку, если вы также хотите сопоставить ее в первой части, и удалить двойную кавычку в последней части, если вы не хотите добавлять ее к совпадению

[\s(]*?["'\s.{]+(?<var>\$[^\s;"}]+)['\s.]*)(?<end>.*)
        ^ Add "                     ^ remove "

Демо

Чтобы соответствовать от открывающей двойной кавычки до закрывающей двойной кавычки в группе var, вы можете обновить группу var до:

(?<var>\$(?:[^"\s;}]+|"[^"\s;]+")*)(?<end>.*)
  • (?<var> Именованная группа захвата var
    • \$ Совпадение $ символ
    • (?: Группа без захвата
      • [^"\s;}]+ Класс отрицательных символов , соответствует любому символу, который не входит в класс символов
      • | или
      • "[^"\s;}]+" Соответствует ", соответствует 1+ раз любому символу, отсутствующему в списке символов, соответствует "
    • )* Закрыть группу без захвата и повторить 0+ раз
  • ) Закрыть группу var

Regex demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...