【问题标题】:Parsing css with a regex使用正则表达式解析 css
【发布时间】:2010-12-09 17:47:41
【问题描述】:

我想扫描一个 css 文件并捕获 cmets 和 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 对此进行测试,这是它当前匹配的内容,以及数组输出的内容。

结果一

[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;}

我必须指出,在正则表达式方面我还是个新手,所以如果有人能提供帮助并指出我哪里出错了,我将不胜感激:)

顺便说一句: 我正在使用 PHP 和 preg_match_all

【问题讨论】:

  • 你能定义你想要什么样的输出吗? “你想要css和cmets”是要全局来确定你想要什么。指定某种数组
  • 我已经在问题中添加了当前的预期输出,希望对您有所帮助:)

标签: php css regex parsing


【解决方案1】:

无法使用正则表达式完全解析 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 }

没有正常的正则表达式足以处理嵌套的 {...} 等,更不用说导入样式表的内容了。

【讨论】:

  • 删除所有换行符,他就安全了!
  • @Mauris 然后会有一行。
  • @Mauris 他不会。想想 cmets、strings 中的“{”……他绝对应该使用专门的 css 解析器。
  • 我要一个简单的案例 - 没有嵌套的花括号 {...} 我目前正在使用的正则表达式匹配跨越多行的声明。如果有人能够设法调整当前的情况以处理上述情况,我将不胜感激!
  • @Damian:是的,通常可以选择一种语言的特定子集来编写解析器,但是一旦你进入开放世界,你会立即找到破坏你的示例工具。这就是为什么遵守标准和使用现有工具而不是编写自己的工具很重要的原因。你最终会做很多工作,但它仍然会继续崩溃
【解决方案2】:

你使用什么语言?

您可能应该只使用一个库来解析 CSS。图书馆可以为您省去很多麻烦。

【讨论】:

  • 我正在使用 PHP,并且 preg_match_all
猜你喜欢
  • 2010-09-19
  • 2011-10-09
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 2012-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多