2016-12-02 40 views
0

可选匹配分组我有我想要使用PHP preg_match_all匹配一个SQL字符串,我需要提取出匹配。它看起来像这样:在正则表达式

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

你是指[**:(?:\(|(?!\ A)\ G(Condition1 =('(?i)[[ alnum:]] +(? - i)\ *?')(or)?))'**](https://www.regex101.com/r/jOmglQ/1)? – revo

+0

@ revo--好,但我想捕获整个子查询,所以我可以从原始查询中删除它 – user101289

+0

整个匹配可以通过'$ matches [ 0]'同时处理'preg_match_all'的输出数组。 – revo

回答

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”与跟随“或” 1或0次0次是针对最后一个在它之后没有更多的“或”,跟着一个“)”来捕捉它们。 接下来,因为你是在PHP中,如果你想如果你想打破这一切正则表达式来删除所有“或”,让每个条件都在自己的变种,像做

$arr=explode(' Or ',$m[1]); /* "Condition1='thisvalue*'", "Condition1 = '8504577'",... */ 

和只看条件值,你可以试试这个:

$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 */ 
}