2013-03-22 4 views
6

Chcę podzielić ciąg tak:podzielonego ciąg oddzielonych przecinkami i znaku równości w PHP z ucieczki

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

Z wyrażenia regularnego więc wynik powinien być

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

byłem próbuje na wiele godzin, ale nie udało się brzydkich konstrukcji tak (dla preg_match_all):

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

a to (dla preg_split)

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

Proszę wyjaśnić, co robię źle?

Odpowiedz

6

Trzeba będzie negatywny lookbehind assertions:

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

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

print_r($res); 

zasadzie pasuje przecinek (lub znak równości), a następnie przez opcjonalny sekwencji znaków spacji, ale tylko jeśli nie ma odwrotny ukośnik poprzedzający go.

+0

Dziękuję bardzo! Zrobiłeś mój dzień :) * czyta o twierdzeniach * – Andrienko

1

Nie bardzo elegancki, ale to powinno załatwić sprawę z preg_split

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

co najważniejsze, nie zapomnij o g na końcu globalnego dopasowania.

+0

Modyfikator g nie istnieje w PCre, czy mieszałeś go ze JavaScriptem? :) –