Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP简单CSS字符串解析器_Php_Css_Regex_Arrays_Parsing - Fatal编程技术网

PHP简单CSS字符串解析器

PHP简单CSS字符串解析器,php,css,regex,arrays,parsing,Php,Css,Regex,Arrays,Parsing,我需要解析一些CSS代码,如: color: black; font-family:"Courier New"; background:url('test.png'); color: red; --crap; 进入: 我需要通过PHP来实现这一点。我可以通过regexp很容易地看到这一点(对那些知道它的人来说很容易,不像我自己:-) 我需要将结果数组“规范化”,标记之间不应该有任何尾随空格,即使它们在源代码中 无价值的css标记应仅作为键包含在数组中。(见——废话) 除了额外的格式(空格、制

我需要解析一些CSS代码,如:

color: black;
font-family:"Courier New";
background:url('test.png');
color: red;
--crap;
进入:

  • 我需要通过PHP来实现这一点。我可以通过regexp很容易地看到这一点(对那些知道它的人来说很容易,不像我自己:-)
  • 我需要将结果数组“规范化”,标记之间不应该有任何尾随空格,即使它们在源代码中
  • 无价值的css标记应仅作为键包含在数组中。(见——废话)
  • 除了额外的格式(空格、制表符)外,引号(和一般值)应保持原样;通过trim()或相关的regexp开关轻松移除
  • 请注意,在这一点上,我特别不需要完整的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
      }
      
      除了你的源数据,没有任何测试,所以我确信它有缺陷。可能足以让您开始。

      您可以尝试:

      $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];
              }
      }
      
      $result=array();
      if(preg_match_all('/\s*([-\w]+)\s*:?\s*(.*?\s*;/m'),$input,$m))
      var_dump(百万美元);
      //$m[1]包含所有属性
      //$m[2]包含它们各自的值。
      
      就($i=0;$i而言,这几周前我发现自己看起来很有趣

      例如:

      $Parser = new cssparser();
      $Results = $Parser->ParseStr("color: black;font-family:"CourierNew";background:url('test.png');color: red;--crap;");
      

      为什么不看一下?

      为什么在
      --crap
      之后没有
      ?一些专有CSS不是键:值格式。我只想支持这种格式。这听起来正是我需要的。谢谢!没有这样的假设,对不起;-)考虑到我需要捕获任何CSS数据,我真的不需要这个。还考虑到它解析选择器(并验证它们?!)这是一个巨大的障碍。你可以使用
      ParseStr
      而不是
      Parse
      Parse('path/to/style.css')
      ,这是我发布这篇文章的主要原因,它向你展示了所有人都会发布的正则表达式的替代品,我的版本可能更大,但获得的速度更快,该代码专门解析完整的CSS格式;而我只需要解析CSS块(或样式属性)中的格式。
      $Parser = new cssparser();
      $Results = $Parser->ParseStr("color: black;font-family:"CourierNew";background:url('test.png');color: red;--crap;");