php – 通过正则表达式解析CSS

前端之家收集整理的这篇文章主要介绍了php – 通过正则表达式解析CSS前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在创建一个CSS编辑器,并尝试创建一个可以从CSS文档获取数据的正则表达式.这个正则表达式有效,如果我有一个属性,但我无法使其适用于所有属性.我在 PHP中使用preg / perl语法.

正则表达式

(?<selector>[A-Za-z]+[\s]*)[\s]*{[\s]*((?<properties>[A-Za-z0-9-_]+)[\s]*:[\s]*(?<values>[A-Za-z0-9#,]+);[\s]*)*[\s]*}

测试用例

body { background: #f00; font: 12px Arial; }

预期结果

Array(
    [0] => Array(
            [0] => body { background: #f00; font: 12px Arial; }
            [selector] => Array(
                [0] => body
            )
            [1] => Array(
                [0] => body
            )
            [2] => font: 12px Arial; 
            [properties] => Array(
                [0] => font
            )
            [3] => Array(
                [0] => font
            )
            [values] => Array(
                [0] => 12px Arial
                [1] => background: #f00
            )
            [4] => Array(
                [0] => 12px Arial
                [1] => background: #f00
            )
        )
)

真实结果

Array(
    [0] => Array
        (
            [0] => body { background: #f00; font: 12px Arial; }
            [selector] => body 
            [1] => body 
            [2] => font: 12px Arial; 
            [properties] => font
            [3] => font
            [values] => 12px Arial
            [4] => 12px Arial
        )
    )

提前感谢任何帮助 – 这一直令我困惑我所有的下午!

对于单个正则表达式来说,这似乎太复杂了.那么我相信,正确的程度,高级用户可以创建正确的正则表达式.但是,您需要一个更高级的用户进行调试.

相反,我建议使用正则表达式来拉出这些片段,然后分别对每个片段进行标记.例如.,

/([^{])\s*\{\s*([^}]*?)\s*}/

然后你最终得到选择器和属性在不同的字段,然后把它们分开. (即使是选择器也是很有趣的解析.)请注意,即使这样会有痛苦,如果}可以出现在引号或某事.你可以再次将它从它中解脱出来,以避免这一点,但是在这里完全可以避免使用正则表达式,并且可以通过一次解析一个字段来处理它,也许通过使用递归下降解析器或者yacc / bison或随你.

猜你在找的PHP相关文章