2016-12-02 2 views
0

Ich habe eine SQL-Zeichenfolge Ich versuche, mit PHP preg_match_all übereinstimmen und ich muss die Übereinstimmungen extrahieren. Es sieht wie folgt aus:Optional passende Untergruppe in Regex

A BUNCH OF MEANINGLESS SQL And (Condition1 = 'thisvalue*' Or Condition1 = '8504577' Or Condition1 = 'somethingelse123*') And MORE MEANINGLESS SQL 

Ich möchte alle diese Condition1 = X Teile greifen und sie in einem anderen Bereich verwendet werden, aber nur, wenn sie in Klammern in den größeren Unterbedingung sind und durch Or s verbunden.

Meine Regex sieht wie folgt aus (https://www.regex101.com/r/gepdq9/3):

/(\((Condition1 = '[\dA-Za-z]+\*?'(\sOr\s)?)+\))/ 

Es entspricht dem größeren Unterbedingung richtig, aber aus irgendeinem Grund die matches[3] Artikel, die ich denke, ist zu erfassen alle thisvalue*, 8504577 und somethingelse123* Werte, erfasst nur die letzte.

Wie kann ich alle diese Übereinstimmungen erfassen?

+1

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

+0

@ revo-- das ist sehr gut, aber ich möchte auch die gesamte Unterabfrage erfassen, damit ich sie aus der ursprünglichen Abfrage entfernen kann. – user101289

+0

Gesamte Übereinstimmung ist zugänglich durch '$ matches 0] 'während der Arbeit mit dem Ausgabe-Array von' preg_match_all' – revo

Antwort

1

hier ist ein Beispielcode, der für Ihr Beispiel funktioniert.

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

es für die „(Condition1“ suchen, die mit „oder“ 1 oder 0 mal folgen die 0 mal für die letzte ist die kein "Oder" mehr haben, gefolgt von einem ")", um sie alle zu erfassen. Als nächstes, weil Sie in PHP sind, wenn Sie alle „oder“ entfernen möchten, und jeder der Zustand in seinem eigenen var haben, so etwas wie

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

Wenn Sie das alles in REGEX brechen wollen und sehen nur die Bedingungen Werte, können Sie dies versuchen:

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