如何从HTML链接中提取HREF值?

fre*_*Wer 3 html regex perl

我的文本文件包含2行:

<IMG SRC="/icons/folder.gif" ALT="[DIR]"> <A HREF="yahoo.com.jp/">yahoo.com.jp/</A>
</PRE><HR>
Run Code Online (Sandbox Code Playgroud)

在我的Perl脚本中,我有:

my $String =~ /.*(HREF=")(.*)(">)/;
print "$2";
Run Code Online (Sandbox Code Playgroud)

我的输出如下:

Output 1: yahoo.com.jp

Output 2: ><HR>
Run Code Online (Sandbox Code Playgroud)

我想要实现的是让我的Perl脚本自动提取内部的字符串 <A Href="">

由于我是正则表达式的新手,我想问一下我的正则表达式是不是很糟糕?如果是这样,有人可以提供一些建议,让它看起来更好吗?

其次,我不知道为什么我的第二个输出是"><HR>",我认为预期的行为是将跳过output2,因为它不包含HREF =".显然我非常错误.

谢谢您的帮助.

Mic*_*man 8

使用正则表达式解析HTML的工作经常足以让你陷入虚假的安全感.对于控制输入的简单情况,您可以使用它,但最好使用HTML :: Parser之类的东西.


Chr*_*ons 8

要回答你关于为什么你的正则表达式不起作用的具体问题,你正在使用.*,这是"贪婪" - 它将默认匹配尽可能多.替代品将使用非贪婪的形式,.*?或者更加严格地说明您要匹配的内容.例如,[^"]*将匹配任何不是双引号的东西,这似乎是您正在寻找的东西.

但是,是的,其他海报是正确的 - 使用正则表达式来做任何在HTML解析中非常重要的事情都是灾难的一个方法.从技术上讲,你可以正确地完成它,特别是在Perl 5.10(具有更高级的正则表达式功能)中,但它通常不值得头疼.