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

标签 php css regex css-parsing

我正在创建一个 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 - 通过正则表达式解析 CSS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/236979/

相关文章:

php - 将查询错误转为 MySQLi 中的异常

php - API 响应 - 从包含的类中收集错误

javascript - CSS 3D Transform——打开一张卡片

javascript - 我应该使用什么公式才能使圆圈始终接触到正确的位置?

javascript - 如何匹配包含给定顺序的给定字符的字符串?

java - 使用匹配项来匹配整个单词

php - "Time ago"来自 MySQL 时间戳

php - Yii 将上传的文件保存为 base64 字符串

css - float 元素但仍将其保持在其父指定的填充内

.net - 什么正则表达式将匹配 2 位或 3 位以 0 开头的数字?