разделен низ, разделен със запетаи и знак за равенство в php с екраниране

Искам да разделя низ по следния начин:

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

С регулярен израз резултатът трябва да бъде такъв

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

Опитвах се с часове, но не успях с грозни конструкции като тази (за preg_match_all):

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

и това (за preg_split)

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

Моля, обяснете какво правя погрешно?


person Ilia Andrienko    schedule 22.03.2013    source източник


Отговори (2)


Ще ви трябват отрицателни утвърждения:

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

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

print_r($res);

По принцип съвпада със запетая (или знак за равенство), последвана от незадължителна последователност от знаци за интервал, НО САМО ако няма обратна наклонена черта пред нея.

person Ja͢ck    schedule 22.03.2013
comment
Много благодаря! Оправихте деня ми :) чете за твърденията - person Ilia Andrienko; 22.03.2013

Не е много елегантно, но това трябва да свърши работа с preg_split

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

Най-важното е, че не забравяйте g в края за глобално съвпадение.

person Mustapha    schedule 22.03.2013
comment
Модификаторът g не съществува в pcre, смесихте ли го с регулярния израз на JavaScript? :) - person Ja͢ck; 22.03.2013