2010-01-25 82 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