Поиск и замена содержимого между определенным тегом

#!/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.


person Chankey Pathak    schedule 25.11.2014    source источник
comment
Попробуйте Mojo::DOM для синтаксического анализа уровня DOM, такого как jquery.   -  person xtreak    schedule 25.11.2014
comment
Мне нравится Mojo::DOM, но я не могу использовать его в офисе, так как для него требуется как минимум 5.10, а мы используем 5.8.5. Грустно, но ничего не поделаешь.   -  person Chankey Pathak    schedule 25.11.2014


Ответы (1)


Я считаю, что это делает то, что вы хотите, заменяет имя класса вашим регулярным выражением для всех дочерних элементов элемента 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;

}
person bytepusher    schedule 26.11.2014