2009-06-07 6 views
8

Ich habe Probleme beim Schreiben eines regulären Ausdrucks (geeignet für PHP preg_match()), die Schlüsselwort = 'Wert' Paare unabhängig davon, ob der <Wert> Die Zeichenfolge ist in einfache oder doppelte Anführungszeichen eingeschlossen. IOW in den beiden folgenden Fällen muss ich > den <Namen> und < Wert erhalten, wo die <Wert> Zeichenfolge, die den nicht-einschließenden Typ von Anführungszeichen enthalten:Need Regex zu analysieren Schlüsselwort = 'Wert' mit einfachen oder doppelten Anführungszeichen

name="value" 
name='value' 

Antwort

14

In Perl ist dies ein regulärer Ausdruck, würde funktionieren. Es stimmt zuerst mit dem Anfang der Zeile überein, stimmt dann mit einem oder mehreren Nicht-Zeichen überein und setzt sie auf $ 1. Als nächstes sieht es für die = dann die eine nicht Klammern mit einer Auswahl für passende „oder" und Sets, die zu $ ​​2.

/^([^=]+)=(?:"([^"]+)"|'([^']+)')$/ 

Wenn man es wollte wie leere Ausdrücke passen.

Diese =“ "

Ersetzen Sie die letzten beiden + mit * Ansonsten sollte diese Arbeit

bearbeiten Wie in den Kommentaren erwähnt. Doug verwendet ...

/^\s?([^=]+)\s?=\s?("([^"]+)"|\'([^\']+)\')\s?/ 

Dies entspricht einem optionalen Leerraum am Ätherende des Eingangs oder Werts, und er hat das Ende der Linienmarkierung entfernt.

+2

es entspricht name = 'asd' mit einem doppelten Anführungszeichen an der, und das ist nicht korrekt –

+1

Nicht mehr passt nicht übereinstimmende Anführungszeichensätze – Copas

+0

argh! Sie aktualisiert es vor meiner Antwort: P –

4
/^(\w+?)=(['"])(\w+?)\2$/ 

, die den Schlüssel in $1 und den Wert in $3 platzieren wird.

1

Ein paar Jahre zu spät, aber da diese Frage sehr auf Google rangiert, und die Antworten, meine Bedürfnisse nicht befriedigen, hier ist eine andere expression:

(?<key>\w+)\s*=\s*(['"]?)(?<val>(?:(?!\2)[^\\]|\\.|\w)+)\2 

Dies einfache oder doppelte Anführungszeichen entsprechen, wobei in Konto maskierte Anführungszeichen und nicht angeführte Werte.

name = bar 
name = "bar" 
name = 'bar' 
name = "\"ba\"r\"" 

Es stellt jedoch eine Einschränkung, dass, wenn ein Wert den Schlüssel aus dem nächsten Schlüssel/Wert-Paar fehlt gelesen wird. Dies kann durch Verwendung einer comma separated list Schlüssel/Wert-Paare behoben werden.