如何使第二个正则表达式匹配优先?

时间:2019-05-13 15:16:07

标签: regex

我试图在MySQL查询中匹配PHP变量,但是由于某些原因,我仍在捕获结束查询的结尾引号(")。问题是我不能仅仅排除引号,因为我需要允许使用数组。

正则表达式: /(?: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 个答案:

答案 0 :(得分:2)

您可以更改模式中的两件事。如果您也想在第一部分中添加双引号,或者不想在匹配中添加双引号,则可以在最后部分删除双引号

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

Demo

要将var组中的开头双引号和结尾双引号匹配,可以将var组更新为:

(?<var>\$(?:[^"\s;}]+|"[^"\s;]+")*)(?<end>.*)
  • (?<var>命名为捕获组var
    • \$匹配$字符
    • (?:非捕获组
      • [^"\s;}]+ Negated character class,匹配不在字符类中的任何字符
      • |
      • "[^"\s;}]+"匹配",匹配不在char列表中的任何char的1倍以上,匹配"
    • )*关闭非捕获组并重复0次以上
  • )关闭组var

Regex demo

相关问题