2010-01-25 81 views
2

什么是Perl的正则表达式,可以替代选择文本,是不是一个锚标记的一部分吗?例如,我想只替换下面代码中的最后一个“文本”。如何替换不属于Perl中锚定标记的文本?

blah <a href="http://www.text.com"> blah text blah </a> blah text blah. 

谢谢。

+3

一饮而尽。正则表达式和HTML。去隐藏... – 2010-01-25 10:12:07

+0

不是第一个和最后两个“blahs”还“不是锚标记的一部分?” – Jay 2010-01-25 10:12:32

+0

@Jay - 我假设OP想'magic_replace(html,'text','link still ok')' – Kobi 2010-01-25 10:19:42

回答

1

我暂时占了上风:

$html =~ s|(text)([^<>]*?<)(?!\/a>)|replacement$2|is; 

但我沮丧,感到沮丧,并通过seminal text娇贵;所以在后续的工作中追求Treebuilder。

+0

正则表达式html解析器的使用会导致你像Charles Dexter Ward一样结束。 – daotoad 2010-01-25 18:28:50

+0

您的正则表达式也将替换'文本'中的“文本”,因为它只查看第一个结束标记。 – cjm 2010-01-25 19:41:51

+0

这取决于你解析什么 - 如果他们是通过例如另一个进程HTML输出小,常规线,那么正则表达式可能是适当的。如果它们是实际完整的HTML页面,那么合适的HTML解析器就有意义了...... – plusplus 2010-01-26 11:01:01

0

不要使用正则表达式对这种东西。使用一些适当的HTML解析器,而只需使用普通的正则表达式为你感兴趣的HTML的部分。

8

你不想尝试用正则表达式解析HTML。改为尝试HTML::TreeBuilder

use HTML::TreeBuilder; 

my $html = HTML::TreeBuilder->new_from_file('file.html'); 
# or some other method, depending on where your HTML is 

doReplace($html); 

sub doReplace 
{ 
    my $elt = shift; 

    foreach my $node ($elt->content_refs_list) { 
    if (ref $$node) { 
     doReplace($$node) unless $$node->tag eq 'a'; 
    } else { 
     $$node =~ s/text/replacement/g; 
    } # end else this is a text node 
    } # end foreach $node 

} # end doReplace