2009-10-24 60 views
0

我想扫描一个css文件并捕获注释和css。我想出了一个正则表达式这是几乎没有,但是,因为它遗漏了性能不是很完美的与多个声明,即用正则表达式解析css

ul.menu li a, # Won't capture this line 
ul.nice-menu li a { text-decoration: none; cursor:pointer; } 

下面是我的工作,正则表达式:

(\/\*[^.]+\*\/\n+)?([\t]*[a-zA-Z0-9\.# -_:@]+[\t\s]*\{[^}]+\}) 

我一直在rubular.com上测试它,这里是它当前匹配的内容,以及数组输出的内容。

结果1

[0] /* Index */ 
/* 
GENERAL 

PAGE REGIONS 
- Header bar region 
- Navigation bar region 
- Footer region   
SECTION SPECIFIC 
- Homepage 
- News */ 

[1] html { background: #ddd; } 

结果2

[0] 
[1] body { background: #FFF; font-family: "Arial", "Verdana", sans-serif; color: #545454;} 

我必须指出,我仍然是一个新的,当涉及到正则表达式,因此,如果有人可以帮助并显示在那里我”要去错了,这将会是非常赞赏:)

BTW: 我使用PHP和preg_match_all

+1

你能定义你想要的输出类型吗? “你想要的CSS和评论”是全球性的,以确定你想要什么。指定某种数组 – 2009-10-24 14:25:21

+0

我已经添加了期望的输出目前喜欢的问题,希望这可以帮助:) – Damian 2009-10-24 14:46:05

回答

6

CSS无法用正则表达式完全解析(请参阅CSS语法:http://www.w3.org/TR/CSS2/grammar.html)。例如,{...}可以按行分割,而您当前的版本不能处理这个问题。如果你需要这样做,你应该阅读CSS规范并使用像ANTLR这样的工具来生成解析器。

这里是W3C规范(http://www.w3.org/TR/CSS2/syndata.html)的例子:

@import "subs.css"; 
@import "print-main.css" print; 
@media print { 
    body { font-size: 10pt } 
} 
h1 {color: blue } 

不正常的正则表达式是强大到足以应付嵌套{...}等更不用说进口样式表的内容。

+0

删除所有换行符,他就会安全! – mauris 2009-10-24 14:32:23

+0

@Mauris然后会有一条线。 – 2009-10-24 14:34:15

+1

@Mauris他不会。只是想到“{”注释,字符串,......他肯定应该使用专门的CSS解析器。 – 2009-10-24 14:36:43

0

你在用什么语言?

你应该使用一个库来解析CSS。图书馆可以为你节省很多的痛苦。

+0

我正在使用PHP和preg_match_all – Damian 2009-10-24 14:48:04

+2

@Damian:已经有PHP CSS解析器。 – PhiLho 2009-10-24 15:16:52