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;
)完全没问题。
下面是一个简单的版本:
$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
}
不与任何测试,除了源数据,所以我敢肯定,它有缺陷。可能足以让你开始。
这听起来就是我需要的。谢谢! – 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];
}
}
我发现这几个星期回来,看起来很有趣。
例子:
$Parser = new cssparser();
$Results = $Parser->ParseStr("color: black;font-family:"CourierNew";background:url('test.png');color: red;--crap;");
考虑到我需要捕获任何CSS数据,我真的不需要这个。还考虑到它分析选择器(并验证它们?!),这是一个巨大的不走。 – Christian 2010-09-15 06:59:59
而不是使用ParseStr你可以使用Parse('path/to/style.css')'Parse',这是我发布这个主要的原因,告诉你一个替代所有每个人都会发布的正则表达式,我的版本tho更大可能快得多 – RobertPitt 2010-09-15 08:07:12
为什么在'--crap'之后没有':'? – codaddict 2010-09-15 06:38:46
某些专有CSS不是key:值格式。我只想简单地支持这种格式。 – Christian 2010-09-15 06:42:00