我试图在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"
)
id
=
$uuid
(实际匹配:$uuid"
)";
(实际匹配:;
)我在链接中包含一个数组,以显示我的意思。那个是正确匹配的。但是我无法弄清楚如何使$uuid
查询匹配而不破坏array
查询。我遇到的问题是,解决$uuid
查询的所有内容都会将array
查询中的匹配项从$_REQUEST["user-id"]
移到$_REQUEST["user-id
。
有没有办法告诉正则表达式不匹配结束引号(如果存在),除非它是数组参数的一部分?
据我所知,匹配引号时,我需要<end>
组优先于<phrase>
组,但是我不知道该怎么做。
答案 0 :(得分:2)
您可以更改模式中的两件事。如果您也想在第一部分中添加双引号,或者不想在匹配中添加双引号,则可以在最后部分删除双引号
[\s(]*?["'\s.{]+(?<var>\$[^\s;"}]+)['\s.]*)(?<end>.*)
^ Add " ^ remove "
要将var组中的开头双引号和结尾双引号匹配,可以将var组更新为:
(?<var>\$(?:[^"\s;}]+|"[^"\s;]+")*)(?<end>.*)
(?<var>
命名为捕获组var
\$
匹配$
字符(?:
非捕获组
[^"\s;}]+
Negated character class,匹配不在字符类中的任何字符|
或"[^"\s;}]+"
匹配"
,匹配不在char列表中的任何char的1倍以上,匹配"
)*
关闭非捕获组并重复0次以上)
关闭组var