PHP简单的CSS串分析器

问题描述:

我需要解析像一些CSS代码:PHP简单的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来做到这一点。我可以通过regexp很容易地看到这一点(对于那些了解它的人来说,很容易,不像我自己:-))。
  • 我需要将结果数组“归一化”,即使它们在源中,令牌之间也不应该有任何尾随空格。
  • 无价值的CSS令牌应该只包含在数组中。 (参见 - 废话)
  • 引号(和一般值)应保持不变,除了额外的格式(空格,制表符);通过trim()或通过相关的正则表达式开关轻松移除。
  • 请不要在这一点上,我特别是不需要一个完整的CSS解析器,即,不需要解析块({...})或选择器(a.myclass#myid)。
  • 哦,考虑到我将这个东西放在一个数组中,如果最后的项目(color:red;完全覆盖原始项目(color:black;)完全没问题。
+0

为什么在'--crap'之后没有':'? – codaddict 2010-09-15 06:38:46

+0

某些专有CSS不是key:值格式。我只想简单地支持这种格式。 – Christian 2010-09-15 06:42:00

下面是一个简单的版本:

$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 2010-09-15 06:42:42

你可以试试:

$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 2010-09-15 06:58:39

+0

它现在没有任何假设。 – codaddict 2010-09-15 07:06:49

我发现这几个星期回来,看起来很有趣。

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 2010-09-15 06:59:59

+0

而不是使用ParseStr你可以使用Parse('path/to/style.css')'Parse',这是我发布这个主要的原因,告诉你一个替代所有每个人都会发布的正则表达式,我的版本tho更大可能快得多 – RobertPitt 2010-09-15 08:07:12

为什么不来看看CSSTidy

+0

同样,该代码特别解析完整的CSS格式;而我只需要解析CSS块(或样式属性)中的格式。 – Christian 2010-09-15 07:00:57