PHP Простой анализатор строк CSS - PullRequest
2 голосов
/ 15 сентября 2010

Мне нужно проанализировать некоторый код CSS, например:

color: black;
font-family:"Courier New";
background:url('test.png');
color: red;
--crap;

Into:

array (
    'color'=>'red',
    'font-family'=>'"Courier New"',
    'background'=>'url(\'test.png\')',
    '--crap'=>''
)
  • Мне нужно сделать это через PHP.Я могу видеть, что это легко сделать с помощью регулярных выражений (ну, это легко для тех, кто знает это, в отличие от меня :-)).
  • Мне нужно, чтобы результирующий массив был "нормализован", не должно быть никаких пробеловтокены, даже если они были в источнике.
  • Бесполезные токены css должны включаться в массив только в качестве ключа.(см. --crap)
  • Кавычки (и значения в целом) должны оставаться как есть, за исключением дополнительного форматирования (пробелы, табуляции);легко удаляется с помощью trim () или с помощью соответствующего переключателя регулярных выражений.
  • Обратите внимание, что на данном этапе мне, в частности, не требуется полный анализатор CSS , т. е. нет необходимости анализироватьблоки ({...}) или селекторы (a.myclass#myid).
  • О, и, учитывая, что я буду помещать эти вещи в массив, вполне нормально, если последние элементы (color:red;) полностью переопределить исходные элементы (color:black;).

Ответы [ 4 ]

2 голосов
/ 15 сентября 2010

Вот простая версия:

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

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

0 голосов
/ 15 сентября 2010

Почему бы не взглянуть на CSSTidy ?

0 голосов
/ 15 сентября 2010

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

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;");
0 голосов
/ 15 сентября 2010

Вы можете попробовать:

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