2009-06-02 8 views
0

Wie kann ich festlegen, welche Reihenfolge den Dingen in einem regulären PCRE-Ausdruck entspricht?Übereinstimmungsreihenfolge in PCRE

Ich habe einen dynamischen regulären Ausdruck, den ein Benutzer liefern kann, der verwendet wird, um zwei Werte aus einer Zeichenfolge zu extrahieren, und speichert sie in zwei Zeichenfolgen. Es gibt jedoch Fälle, in denen die beiden Werte in der Zeichenfolge in umgekehrter Reihenfolge vorkommen können, also die erste (\ w +) oder was auch immer in der zweiten Zeichenfolge gespeichert werden muss.

+1

Können Sie ein paar Beispiele geben? – DrAl

Antwort

3

können Sie die Zeichenketten mit Namen extrahieren

mit
(?<name>\w+) 

und die Werte mit

pcre_get_named_substring 
+0

Aber woher wissen Sie, welcher Name welchem ​​Teilstring zugeordnet werden soll? Dies bringt Sie näher an die Lösung des Problems, herauszufinden, welche Gruppe mit welcher Teilkette übereinstimmt. –

1

erhalten Wenn Sie beide Teile mit dem gleichen Teilmuster sind passend (wie \w+), du bist kein Glück. Wenn die Untermuster jedoch unterschiedlich sind, haben Sie einige Optionen, von denen keines sehr hübsch ist. Hier ist ein regulärer Ausdruck, der ein bedingtes Konstrukt verwendet in beliebiger Reihenfolge die src und type Attribute eines HTML-Script-Elements entsprechen:

\b(?(?=src=) 
    src="([^"]*)"\s+type="([^"]*)"| 
    type="([^"]*)"\s+src="([^"]*)" 
) 

(HAFTUNGSAUSSCHLUSS: Diese Regex macht viele unrealistischen Annahmen, Leiter unter ihnen, dass beiden Attribute vorhanden sein und dass sie dann aneinander angrenzen. ich verwende es nur um die Technik zu veranschaulichen.)

Wenn das src Attribut wird zunächst die src und type Werte werden jeweils in den ersten und zweiten Gruppen erfaßt werden. Ansonsten erscheinen sie in der vierten und dritten Gruppe. Benannte Gruppen würden es einfacher machen, die Dinge im Auge zu behalten, besonders wenn sie denselben Namen an mehr als einem Ort verwenden könnten, wie es bei .NET-Regexen möglich ist. Unglücklicherweise verlangt PCRE, dass jede benannte Gruppe einen eindeutigen Namen hat, was zu schlecht ist; das ist eine sehr nette Eigenschaft.