我有一个SQL字符串,我试图使用PHP preg_match_all
进行匹配,我需要提取匹配项。它看起来像这样:
A BUNCH OF MEANINGLESS SQL And (Condition1 = 'thisvalue*' Or Condition1 = '8504577' Or Condition1 = 'somethingelse123*') And MORE MEANINGLESS SQL
我想抓住所有Condition1 = X
部分,并在不同的区域使用它们,但只有它们在括号中的较大子条件下并且由Or
s连接。
我的正则表达式如下(https://www.regex101.com/r/gepdq9/3):
/(\((Condition1 = '[\dA-Za-z]+\*?'(\sOr\s)?)+\))/
它正确匹配较大的子条件,但出于某种原因matches[3]
项,我认为应该捕获所有thisvalue*
,8504577
和somethingelse123*
值,只捕获最后一个。
如何捕获所有这些匹配项?
答案 0 :(得分:1)
这是一个适用于您的示例的示例代码:
$a="A BUNCH OF MEANINGLESS SQL And (Condition1 = 'thisvalue*' Or Condition1 = '8504577' Or Condition1 = 'somethingelse123') And MORE MEANINGLESS SQL";
if (preg_match('/\((Condition1.*( Or )?)\) /',$a,$m)){
print $m[1]; /* Condition1 = 'thisvalue*' Or Condition1 = '8504577' Or Condition1 = 'somethingelse123' */
}
它正在寻找"(条件1和#34;以及"或" 1或0次.0次是最后一个不再有的"或者"在它之后。跟随")"抓住他们。 接下来,因为你是PHP,如果你想删除所有"或者"并将每个条件放在自己的var中,执行类似
的操作$arr=explode(' Or ',$m[1]); /* "Condition1='thisvalue*'", "Condition1 = '8504577'",... */
如果你想在regEx中打破它并且仅查看条件值,你可以试试这个:
$a="A BUNCH OF MEANINGLESS SQL And (Condition1 = 'thisvalue*' Or Condition1 = '8504577' Or Condition1 = 'somethingelse123') And MORE MEANINGLESS SQL";
if (preg_match_all("/Condition1 = '([^']+)'( Or )?/",$a,$m)){
print_r($m[1]); /* [0] => thisvalue* [1] => 8504577 [2] => somethingelse123 */
}