【发布时间】:2012-03-26 10:46:34
【问题描述】:
在 HTML 源代码中,我需要提取 FONT 标记内的任何简单文本,其中包含(不多也不少)这 3 个属性,顺序不限:size=5、color="red"、face="verdana" .
因此,例如,正则表达式必须提取除最后四个之外的所有以下“随机文本”。
<font size=5 color="red" face="verdana">randomtext</font>
<font size=5 face="verdana" color="red">randomtext</font>
<font color="red" size=5 face="verdana">randomtext</font>
<font color="red" face="verdana" size=5>randomtext</font>
<font face="verdana" size=5 color="red">randomtext</font>
<font face="verdana" color="red" size=5>randomtext</font>
<font size=5 size=5 size=5>randomtext</font>
<font face="verdana" color="red" size=5 foobar="random">randomtext</font>
<font face="verdana" color="red" size=5 foobar="random=pippo">randomtext</font>
<font face="verdana" color="red" size=5 garbagetext>randomtext</font>
我通过使用 3 个前瞻解决了“按任意顺序”问题:
<font(?=[^>]* size=5)(?=[^>]* color="red")(?=[^>]* face="verdana")[^>]*>([^<]+)</font>
...或者更多的 html 灵活性:
<\s*font(?=[^>]*\s+size\s*=\s*5)(?=[^>]*\scolor\s*=\s*["']red["'])(?=[^>]*\sface\s*=\s*["']verdana["'])[^>]*>\s*([^<]+?)\s*<\s*/font\s*>
问题是它也匹配最后三个。 如何排除那些匹配? (显然,以一种通用且合理的简短/有效方式,即不使用所有可能的正面组合,也不使用仅适用于我的示例的字面负面表达)
【问题讨论】:
-
您使用什么语言?使用适当的 HTML 解析库可以更轻松地处理此任务。
-
Michael,它必须在单个正则表达式中解决,与语言无关。正则表达式风格是 PCRE。
-
我已经找到了一个简短的单正则表达式解决方案,但它重复了所有三个属性一次,使我的示例正则表达式的长度加倍。虽然如果我写下所有可能的组合并不长,但我认为它仍然不是更短/最好的解决方案。
标签: regex