Мне нужно разобрать некоторый CSS-код, например:
color: black; font-family:"Courier New"; background:url('test.png'); color: red; --crap;
В:
array ( 'color'=>'red', 'font-family'=>'"Courier New"', 'background'=>'url(\'test.png\')', '--crap'=>'' )
a.myclass#myid
Нет необходимости разбирать блоки ( {...}
) или селекторов ( a.myclass#myid
). color:red;
) полностью переопределяют исходные элементы ( color:black;
). Вот простая версия:
$a = array(); preg_match_all('/^\s*([^:]+)(:\s*(.+))?;\s*$/m', $css, $matches, PREG_SET_ORDER); foreach ($matches as $match) $a[$match[1]] = isset($match[3]) ? $match[3] : null;
Пример вывода:
array(4) { ["color"]=> string(3) "red" ["font-family"]=> string(13) ""Courier New"" ["background"]=> string(15) "url('test.png')" ["--crap"]=> NULL }
Не проверен ничем, кроме исходных данных, поэтому я уверен, что у него есть недостатки. Может быть достаточно, чтобы вы начали.
Я нашел это несколько недель назад и выглядит интересным.
Пример:
$Parser = new cssparser(); $Results = $Parser->ParseStr("color: black;font-family:"CourierNew";background:url('test.png');color: red;--crap;");
Почему бы не взглянуть на CSSTidy ?
Можешь попробовать:
$result = array(); if(preg_match_all('/\s*([-\w]+)\s*:?\s*(.*?)\s*;/m',$input,$m)) var_dump($m); // $m[1] contains all the properties // $m[2] contains their respective values. for($i=0;$i<count($m[1]);$i++) { $result[$m[1][$i]] = $m[2][$i]; } }