【问题标题】:PHP Simple CSS string parserPHP 简单的 CSS 字符串解析器
【发布时间】:2011-04-12 12:37:57
【问题描述】:

我需要解析一些 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 标记应仅作为键包含在数组中。 (见--废话)
  • 引号(和一般的值)应保持原样,除了额外的格式(空格、制表符);通过 trim() 或相关的正则表达式开关轻松删除。
  • 请注意,此时我特别不需要完整的 CSS 解析器,即不需要解析块 ({...}) 或选择器 (a.myclass#myid)。
  • 哦,考虑到我会将这些东西放在一个数组中,如果最后的项目 (color:red;)完全覆盖原始项目 (color:black;),那是完全可以的。

【问题讨论】:

  • 为什么--crap后面没有:
  • 某些专有 CSS 不是 key:value 格式。我想简单地支持这种格式。

标签: php css regex arrays parsing


【解决方案1】:

这是一个简单的版本:

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

除了您的源数据外,没有对任何东西进行测试,所以我确信它有缺陷。可能足以让您入门。

【讨论】:

  • 这听起来正是我所需要的。谢谢!
【解决方案2】:

几周前我发现了这个,看起来很有趣。

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;");

【讨论】:

  • 考虑到我需要捕获任何 CSS 数据,我真的不需要这个。还考虑到它解析选择器(并验证它们?!)这是一个巨大的不可行。
  • 你可以使用ParseParse('path/to/style.css') 一样使用Parse 而不是使用ParseStr,我发布此内容的主要原因是向您展示每个人都会发布的所有正则表达式的替代方案,我的版本更大的是可能快得多
【解决方案3】:

为什么不看看CSSTidy

【讨论】:

  • 同样,该代码专门解析完整的 CSS 格式;而我只需要解析 CSS 块(或样式属性)中的格式。
【解决方案4】:

你可以试试:

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

【讨论】:

  • 没有这样的假设,抱歉 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
  • 1970-01-01
  • 2013-02-22
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
相关资源
最近更新 更多