小编典典

通过正则表达式解析CSS

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

在此先感谢您的帮助-整个下午使我感到困惑!


阅读 526

收藏
2020-05-16

共1个答案

小编典典

对于单个正则表达式来说,这似乎太令人费解了。好吧,我敢肯定,通过正确的扩展,高级用户可以创建正确的正则表达式。但是,那么您需要一个更高级的用户来对其进行调试。

相反,我建议使用正则表达式来提取片段,然后分别标记每个片段。例如,

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

然后,将选择器和属性放在单独的字段中,然后将它们拆分。(即使选择器也会很有趣。)请注意,如果}可以出现在引号或其他内容中,即使这样也会很麻烦。您可以再次绕开它,以免发生这种情况,但最好还是完全避开regex,并一次解析一个字段来处理它,也许可以使用递归下降解析器或yacc
/ bison或随你。

2020-05-16