我正在创建一个 CSS 编辑器,并尝试创建一个可以从 CSS 文档获取数据的正则表达式。如果我有一个属性,则此正则表达式有效,但无法让它适用于所有属性。我在 PHP 中使用 preg/perl 语法。
Regex
(?<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 或任何。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)