代码之家  ›  专栏  ›  技术社区  ›  Christian

PHP简单CSS字符串分析器

  •  2
  • Christian  · 技术社区  · 14 年前

    我需要解析一些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()或通过相关的regexp开关轻松删除。
    • 请不要在这一点上,我特别 不需要完整的CSS分析器 也就是说,不需要解析块( {...} )或选择器( a.myclass#myid )
    • 哦,考虑到我要把这些东西放在一个数组中,如果最后一个项目是完全可以的( color:red; ) 完全覆盖 原始项目( color:black; )
    4 回复  |  直到 14 年前
        1
  •  2
  •   Matthew    14 年前

    下面是一个简单的版本:

        $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
  •  0
  •   RobertPitt    14 年前

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

    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;");
    
        3
  •  0
  •   fabrik    14 年前

    为什么不看看呢 CSSTidy ?

        4
  •  0
  •   codaddict    14 年前

    你可以试试:

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