我正在创建一个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或随你.