【发布时间】:2010-12-08 13:21:18
【问题描述】:
我正在尝试从 HTML 文档中删除外部链接,但保留锚点,但我运气不佳。以下正则表达式
$html =~ s/<a href=".+?\.htm">(.+?)<\/a>/$1/sig;
将匹配锚标记的开头和外部链接标记的结尾,例如
<a HREF="#FN1" name="01">1</a>
some other html
<a href="155.htm">No. 155
</a> <!-- end tag not necessarily on the same line -->
所以我最终什么都没有,而不是
<a HREF="#FN1" name="01">1</a>
some other html
碰巧所有锚的 href 属性都是大写的,所以我知道我可以进行区分大小写的匹配,但我不想依赖它在未来总是如此。
我可以改变什么,让它只匹配a标签吗?
【问题讨论】:
-
哦,每当我看到另一个“如何使用正则表达式解析 HTML?”时,我的大脑是多么的痛。题。在继续之前查看stackoverflow.com/questions/701166/… 和stackoverflow.com/questions/773340/…(以及stackoverflow.com/questions/487213/…)。
-
在一般情况下,是的,正则表达式并不是真正为解析 XML/HTML 而设计的。也就是说,如果问题空间有限,它可能是一个可行的选择。
-
这里有 Mark Jason Dominus 的一篇很棒的文章:perl.plover.com/yak/12views/samples/notes.html “我们不要忘记 Perl 的优点。它擅长与其他程序交互,它有利于快速原型设计。让我们当人们按照设计使用 Perl 的方式使用 Perl 时,不会给他们带来麻烦。”
-
@Kinopiko 你不能忽视 MJD 的讨论。另外,MJD 并没有为会给出错误结果的方法辩护。另外,关于调用外部命令,我完全同意 MJD。现在,这个页面上反对用正则表达式解析 HTML 的人已经提出了合理、深思熟虑的论点,向您展示了该方法是多么容易失败。你碰巧忽略了所有这些论点,声称这是教条。那好吧。 books.google.com/…
-
@Kinopiko,香烟会致癌。人类活动在气候变化中发挥着重要作用。人和猿有共同的祖先。许多人声称这些事实只是教条。但这并不能改变它们是真实的事实。用正则表达式解析 HTML 是个坏主意。有时越差越好,但在这种情况下,依赖正则表达式是自找麻烦——哎呀,我们有一个指向 .php 文件的链接,哎呀,这是一个指向 .cgi 的链接,ad naseum——所以正则表达式增长了,越来越笨拙,而且总是破碎。真正的解析器方法更容易编写(正确的代码)、更容易维护和更容易理解。