PHP Простой синтаксический анализатор строк CSS

Мне нужно разобрать некоторый 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'=>'' ) 
  • Мне нужно сделать это через PHP. Я вижу, что это легко сделать с помощью регулярного выражения (хорошо, легко для тех, кто это знает, в отличие от меня :-)).
  • Мне нужно, чтобы результирующий массив был «нормализован», не должно быть никаких конечных промежутков между токенами, даже если они были в источнике.
  • Значения цензуры css должны быть включены в массив только как ключ. (см. –crap)
  • Котировки (и значения в целом) должны оставаться как есть, кроме дополнительного форматирования (пробелы, вкладки); легко удаляется с помощью trim () или с помощью соответствующего переключателя регулярного выражения.
  • Пожалуйста, не то, что на данный момент мне определенно не нужен полный синтаксический анализатор CSS , т. 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 } 

Не проверен ничем, кроме исходных данных, поэтому я уверен, что у него есть недостатки. Может быть достаточно, чтобы вы начали.

Я нашел это несколько недель назад и выглядит интересным.

http://websvn.atrc.utoronto.ca/wsvn/filedetails.php?repname=atutor&path=/trunk/docs/include/classes/cssparser.php

Пример:

 $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]; } }