$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]
答案 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";
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]