从嵌套的html标记中提取值的Perl正则表达式
请试试这个: (一) (二) 3) ) (四) 输出: unixshell 惠普 一般的 [1] 试试这个:从嵌套的html标记中提取值的Perl正则表达式,html,regex,perl,Html,Regex,Perl,请试试这个: (一) (二) 3) ) (四) 输出: unixshell 惠普 一般的 [1] 试试这个: <h1><b><i>Google</i></b></h1> 试试这个: <h1><b><i>Google</i></b></h1> 对于这个您可以使用的简单案例:需求不再简单,请查看@amon关于如何使用HTML解析器的答案 /<a.*
<h1><b><i>Google</i></b></h1>
试试这个:
<h1><b><i>Google</i></b></h1>
对于这个您可以使用的简单案例:需求不再简单,请查看@amon关于如何使用HTML解析器的答案
/<a.*?>([^<]+)</
对于这个您可以使用的简单案例:需求不再简单,请查看@amon关于如何使用HTML解析器的答案
/<a.*?>([^<]+)</
如注释中所述,不要使用正则表达式。我特别喜欢,它允许我使用CSS选择器:
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
如注释中所述,不要使用正则表达式。我特别喜欢,它允许我使用CSS选择器:
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
我提出了这个正则表达式,它适用于PCRE下的所有采样输入。这个正则表达式等价于具有尾部递归模式(?1)的正则语法* (?)((?:\w+(:\s*)(?:\1)*
只需获取返回数组的第一个元素,即array[0]我提出了这个正则表达式,它适用于PCRE下的所有采样输入。这个正则表达式等价于具有尾部递归模式(?1)的正则语法* (?)((?:\w+(:\s*)(?:\1)*
只需获取返回数组的第一个元素,即数组[0]不要使用正则表达式解析HTML。这是个坏主意™.你的表达是“把所有的东西都拿走,直到结束”,这就是你得到的。您需要使用
Perl有许多优秀的HTML解析器(例如)。不要使用正则表达式。我知道如何提取值,几乎可以工作,在排除结束标记时失败,知道吗?不要使用正则表达式解析HTML。这是个坏主意™.你的表达是“把所有的东西都拿走,直到结束”,这就是你得到的。您需要使用
Perl有许多优秀的HTML解析器(例如)。不要使用正则表达式。虽然我知道用于提取值,几乎可以工作,但在排除结束标记时失败,有什么想法吗?Floris,它可以有一个或多个嵌套:@user1239790-我已经给出了第二个表达式来处理“任何嵌套”。尝试了以下操作:不起作用:if($match=~([^>]*?)/{$title=$1;}else{$title=”“;}你用的表达方式和我说的不一样。当你使用我的第二个表达式时,你得到了什么结果?我试过了,很好。正在工作。。。只需要删除***下的html标记(如果有)并获取值。Floris,它可能有一个或多个嵌套:@user1239790-我已经给出了第二个表达式来处理“任何嵌套”。尝试以下操作:无效:if($match=~/([^>]*?)/){$title=$1;}否则{$title=“;}您使用的表达式不是我给出的表达式。当你使用我的第二个表达式时,你得到了什么结果?我试过了,很好。正在工作。。。只需要删除***下的html标记(如果有)并获取值。@user1239790您开始明白为什么不应该使用正则表达式了吗?您的表达式不应该是/([^>]+)是的,我看到了,正则表达式与标记有关,我们不能为上面的问题提供正则表达式解决方案吗?这将在嵌套标记之间获取文本/(?)([^>@hwnd确实如此-但它(答案中给出的表达式,而不是注释中的表达式)将因多个嵌套标记而失败。@user1239790您开始明白为什么不应该使用正则表达式了吗?您的表达式不应该是/([^>]+)是的,我看到了,正则表达式与标记有关,我们不能为上面的问题提供正则表达式解决方案吗?这将在嵌套的标记之间抓取文本。/(?)([^>@hwnd是的-但是它(答案中给出的表达式,而不是注释中的表达式)将因多个嵌套的标记而失败。
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";