2014-11-25 4 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::Parser 또는 HTML::TreeBuilder을 사용하여 완료했는지 확인하고 싶습니다.특정 태그 간의 내용 검색 및 바꾸기

+0

jquery와 같은 DOM 수준 구문 분석을 위해 Mojo :: DOM을 시도해보십시오. – xtreak

+0

Mojo :: DOM을 좋아하지만 최소한 5.10을 필요로하고 사무실에서 사용할 수 없으며 5.8.5를 사용하고 있습니다. 슬프지만 그것을 도울 수는 없습니다. –

답변

3

나는 HTML :: TreeBuilder를 사용하여 classname을 body 요소의 모든 자식에서 정규 표현식으로 바꾸고 싶다고 생각합니다.

입력에 다른 더미 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; 

}