Perl Regular Expression从嵌套的html标签中提取值

时间:2013-08-28 12:54:53

标签: html regex perl

$match = q(<a href="#google"><h1><b>Google</b></h1></a>);
if($match =~ /<a.*?href.*?><.?>(.*?)<\/a>/){
$title = $1;
}else {
$title="";
}
print"$title";

输出:Google</b></h1>

应该是:Google

无法在Perl中使用Regex从链接中提取值,它可能会有一个或多或少的嵌套:

<h1><b><i>Google</i></b></h1>

请试试这个:

1)&lt; td&gt;&lt; a href =“/ wiki / Unix_shell”title =“Unix shell”&gt; Unix shell&lt; / a&gt;

2)&lt; a href =“http://www.hp.com”&gt;&lt; h1&gt;&lt; b&gt; HP&lt; / b&gt;&lt; / h1&gt;&lt; / a&gt;

3)&lt; a href =“/ wiki / Generic_programming”title =“Generic programming”&gt; generic&lt; / a&gt;&lt; / td&gt;);

4)&lt; a href =“#cite_note-1”&gt;&lt; span&gt; [&lt; / span&gt; 1&lt; span&gt;]&lt; / span&gt;&lt; / a&gt;

输出:

Unix shell

HP

通用

[1]

4 个答案:

答案 0 :(得分:5)

请勿使用注释中提到的正则表达式。我特别喜欢Mojo suite,它允许我使用CSS选择器:

use Mojo;

my $dom = Mojo::DOM->new(q(<a href="#google"><h1><b>Google</b></h1></a>));

print $dom->at('a[href="#google"]')->all_text, "\n";

HTML::TreeBuilder::XPath

use HTML::TreeBuilder::XPath;

my $dom = HTML::TreeBuilder::XPath->new_from_content(q(<a href="#google"><h1><b>Google</b></h1></a>));

print $dom->findvalue('//a[@href="#google"]'), "\n";

答案 1 :(得分:2)

试试这个:

if($match =~ /<a.*?href.*?><b>(.*?)<\/b>/)

这应该是“href之后和<b>...</b>标记之间的所有内容

相反,要获得“上一个>之后和第一个</之前的所有内容,您可以使用

<a.*?href.*?>([^>]*?)<\/

答案 2 :(得分:0)

对于这个简单的例子,您可以使用:要求不再简单,请查看@ amon关于如何使用HTML解析器的答案。


/<a.*?>([^<]+)</

匹配一个开头a标记,后跟任何内容,直到找到><之间的内容。

虽然正如其他人所提到的,你通常应该使用HTML解析器。

echo '<td><a href="/wiki/Unix_shell" title="Unix shell">Unix shell</a>
<a href="http://www.hp.com"><h1><b>HP</b></h1></a>
<a href="/wiki/Generic_programming" title="Generic programming">generic</a></td>);' | perl -ne '/<a.*?>([^<]+)</; print "$1\n"'
Unix shell
HP
generic

答案 3 :(得分:0)

我想出了这个正则表达式,适用于PCRE下的所有采样输入。这个正则表达式相当于具有尾递归模式(?1)*

的常规语法

(?&LT; =&GT)((?:?\ W +)(:\ S *))(α1)*

只需获取返回数组的第一个元素,即array [0]