2013-03-22 17 views
6

Ich mag eine Zeichenfolge wie folgt aufteilen:Split-String durch Kommas und Gleichheitszeichen in PHP getrennt mit Flucht

colors = blue, green, yellow, kinda violet\, not sure,purple\=almost magenta 

Mit regulärem Ausdruck so sollte das Ergebnis

seine
colors 
blue 
green 
yellow 
kinda violet\, not sure 
purple\=almost magenta 

ich bin stundenlang versucht, aber mit hässlichen Konstruktionen wie diese (für preg_match_all) war nicht erfolgreich:

/(.*)\s*[=]\s*((.+)\s*,\s*)*/ 

und diese (für preg_split)

/\s*[=,^(\\,)^(\\=)]\s*/ 

Bitte, explayne was mache ich falsch?

Antwort

6

würden Sie negativ benötigen Lookbehind assertions:

$s = 'colors = blue, green, yellow, kinda violet\, not sure,purple\=almost magenta'; 

$res = preg_split('/(?<!\\\\)[,=]\s*/', $s); 

print_r($res); 

Grundsätzlich entspricht es ein Komma (oder Gleichheitszeichen) durch eine optionale Folge von Leerzeichen gefolgt aber nur, wenn es vorangehenden es kein Backslash.

+0

Vielen Dank! Du hast meinen Tag gemacht :) * liest über Assertions * – Andrienko

1

Nicht sehr elegant, aber dies sollte mit preg_split

/(\s*=\s*)|(\s*,\s*)|(\s*\\=\s*)|(\s*\\,\s*)/g 

Am wichtigsten ist der Trick, nicht zu vergessen die g am Ende für die globale Matching.

+0

Der Modifikator g existiert nicht in pcre, hast du ihn mit JavaScript regex gemischt? :) –