use HTML::TokeParser::Simple; my $p = HTML::TokeParser::Simple->new( \$original_html ); my $new_html = ''; while ( my $token = $p->get_token ) { unless ($token->is_text) { $new_html .= $token->return_text; } else { my $text = $token->return_text; $text =~ s/foo/foo/g; $new_html .= $text; } }