【发布时间】:2013-07-19 07:45:24
【问题描述】:
我遇到了 Perl 正则表达式的问题。在img 元素上,我想将src 属性与以/file?id 开头的值以及任何class 和alt 属性进行匹配。我想忽略有时存在有时不存在的rel 属性,如下所示:
<img rel="lightbox[45451]" src="/file?id=13166" class="bbc_img" alt="myimagess.jpg">
<img src="/file?id=13166" class="bbc_img" alt="myimagess.jpg">
我的问题是如何处理可选的rel 属性。
我正在为rel 属性匹配尝试这个:
(?!\s+(rel)="([^"]+)")
当没有rel 属性时它可以工作,但当img 有rel 属性时它会失败。
【问题讨论】:
-
Don't do that,请改用真实的HTML parser。
-
@Quentin 使用正则表达式来匹配已知的、有限的 HTML/XML 子集可能很好,具体取决于所需的稳健性与复杂性和性能级别。也就是当你知道为什么和后果是什么时,打破规则是可以的。
-
@January:不是真的。使用现成的解析器几乎总是比使用正则表达式更快且更少脏。而 HTML 不是正则表达式的不良目标,正如这个问题所表明的那样,并且会误导学习者。
-
@January:我完全不同意。正则表达式不可能比为域编写的解析器“更持久”。特别是,这项任务非常复杂,需要非常全面的测试,而且永远无法确认它是正确的。通过为不打算处理的数据编写代码来学习语言并不是一个好方法。 HTML 不是常规语言,您永远无法使用正则表达式编写完整的通用 HTML 处理解决方案。您不妨提倡在 Logo 中编写客户端脚本。
-
@January:不。使用正则表达式处理不规则语言是一个坏主意。请不要宣传你的错误想法。