И снова регулярка

NeD

Новичок
Задача разбить строки в массив. Разделитель - запятая. Запятые находящиеся в кавычках игнорируем. Код ниже почти рабочий
PHP:
$str = "name='viewport',content='width=device-width,initial-scale=1.0'";
preg_match_all('/[^, ?].*?[=:]\s*(?:([\'"]).*?\1|.*?)(?=,|\s*$)/',$str,$m);
var_dump($m[0]);
 
array (size=2)
0 => string 'name='viewport'' (length=15)
1 => string 'content='width=device-width,initial-scale=1.0'' (length=46)


preg_match_all('/[^, ?].*?[=:]\s*(?:([\'"]).*?\1|.*?)(?=,|\s*$)/','type="checkbox", checked',$m);
var_dump($m[0]);
 
 
array (size=1)
0 => string 'type="checkbox"' (length=15)
 
 
preg_match_all('/[^, ?].*?[=:]\s*(?:([\'"]).*?\1|.*?)(?=,|\s*$)/','type="checkbox", checked: true',$m);
var_dump($m[0]);
 
array (size=2)
0 => string 'type="checkbox"' (length=15)
1 => string 'checked: true' (length=13)
Проблема со строкой вида 'type="checkbox", checked'. Теряется "cheked"
Если делать опциональным [:=], то неправильно бьётся "name='viewport',content='width=device-width,initial-scale=1.0'"
PHP:
array (size=3)
0 => string 'name='viewport'' (length=15)
1 => string 'content='width=device-width' (length=27)
2 => string 'initial-scale=1.0'' (length=18)
Мозг кипит уже.
 

Вурдалак

Продвинутый новичок
Напиши обычный парсер без регулярных выражений.
PHP:
for($i = 0; $i < strlen($s); $i++) // ...
 

keltanas

marty cats
У меня получилось как-то так.
PHP:
(\w+?=(?:['][^']+[']|["][^"]+["])|[^,]+)
А вообще ты бы тесты сначала написал. А то мозг кипит разбираться, какой вариант тебя устраивает, а какой нет?
...
Или даже так:
PHP:
\w+?[=:](?:['][^']+[']|["][^"]+["]|[^,]+)
 

keltanas

marty cats
Вурдалак так получилось )) ТС может причесать при желании
А с другой стороны, это уже вопрос перфекционизма, имхо. Тоже, что надо ли одну команду в { .. } заключать или нет?))
 
Сверху