2010-09-15 2 views
2

Мне нужно разобрать некоторые CSS код, как:PHP Simple 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).
  • О, и учитывая, что я буду помещать это вещество в массив, это нормально, если последние элементы (color:red;) полностью переопределяют оригинальные изделия (color:black;).
+0

Почему нет '' 'после' --crap'? – codaddict

+0

Некоторые проприетарные CSS не входят в ключ: формат значения. Я бы хотел просто поддержать такой формат. – Christian

ответ

2

Вот простой вариант: выход

$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

Это звучит примерно так, как мне нужно. Благодаря! – Christian

0

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

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

Нет такого предположения, извините ;-) – Christian

+0

Теперь он работает без предположения. – codaddict

0

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

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

Учитывая, что мне нужно записывать любые данные CSS, мне это действительно не нужно. Также учитывая, что он разбирает селекторов (и проверяет их ?!), это огромный шаг. – Christian

+0

Вместо использования 'ParseStr' вы можете использовать' Parse', например 'Parse ('path/to/style.css')', основную причину, по которой я разместил это, чтобы показать вам альтернативу всем регулярным выражениям, которые все будут публиковать, версия tho больше, вероятно, намного быстрее – RobertPitt

0

Почему бы не посмотреть на CSSTidy?

+0

Опять же, этот код специально анализирует полный формат CSS; в то время как мне просто нужно разобрать формат в блоке CSS (или атрибуте стиля). – Christian

Смежные вопросы