可选地匹配正则表达式中的子组

时间:2016-12-02 18:57:23

标签: php regex preg-match preg-match-all

我有一个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*8504577somethingelse123*值,只捕获最后一个。

如何捕获所有这些匹配项?

1 个答案:

答案 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 */
}