2014-11-25 74 views
1
#!/usr/bin/perl 
use strict; 
use warnings; 
my $html = q| 
    <html> 
    <head> 
    <style> 
    .classname{ 
     color: red; 
    } 
    </style> 
    </head> 
    <body> 
    classname will have a color property. 
    </body> 
    </html> 
|; 
$html=~s/classname/NEW/g; 
print $html; 

這將在兩個地方替換classname。我如何才能將更換僅限於<body>的內容?我希望看到它使用HTML::ParserHTML::TreeBuilder完成。搜索並替換特定標記之間的內容

+0

嘗試使用Mojo :: DOM進行DOM級別解析,如jquery。 – xtreak 2014-11-25 10:48:27

+0

我愛Mojo :: DOM,但我不能在辦公室使用它,因爲它至少需要5.10,而且我們使用的是5.8.5。悲傷但不能幫助它。 – 2014-11-25 10:50:17

回答

3

我相信這是做你想做的,用你的正則表達式替換classname的body元素的所有子元素,使用HTML :: TreeBuilder。

我添加了另一個虛擬div來輸入,以確保它正在正確處理。

#!/usr/bin/perl 
use strict; 
use warnings; 

use HTML::TreeBuilder; 

my $html = q| 
    <html> 
    <head> 
    <style> 
    .classname{ 
     color: red; 
    } 
    </style> 
    </head> 
    <body> 
    classname will have a color property. 
    <div>more text with classname in it</div> 
    </body> 
    </html> 
|; 

my $tree = HTML::TreeBuilder->new_from_content($html); 

replace_text($tree->find_by_tag_name("body")); 

print $tree->as_HTML."\n"; 

sub replace_text { 

    my $html_element = shift; 

    for my $el ($html_element->content_refs_list){ 

    if (ref($$el)){ 
     replace_text($$el); 
     next; 
    } 

    $$el =~ s /classname/NEW/g; 

    } 

    return $html_element; 

}