0

我希望从 HTML 文档中替换不是 HTML 标记的任何内容。所以,基本上试图摆脱文档中的所有文本。

我有下面的正则表达式来从字符串中删除所有 HTML,但在相反的情况下需要帮助。

$string =~ s/<[^>]+>//g;

谢谢。

4

4 回答 4

1

如果这是正则表达式 s///从文档中删除所有 html 的替换

$string =~ s/<[^>]+>//g;

然后您可以在 am//atch 运算符中使用相同的正则表达式来保留文档中的所有 html

$string = join '', $string =~ m/<[^>]+>/g;

如果上面的正则表达式满足您的要求,那么您就完成了:) 但也许您想考虑这个 ol' 正则表达式模式,稍微长一点:D http://perlmonks.org/?node_id=161281 请注意像 Ethan Browne 提到的警告:)

于 2013-10-24T07:41:36.267 回答
1

Ethan Brown 对 HTML::DOM 进行名称检查,就好像它是唯一的CPAN 解决方案一样。

HTML::Parser 更加普遍,但谷歌搜索更多内容并不难。

http://metacpan.org/pod/HTML::Parser

使用 HTML::Parser 的解决方案是(测试一次):

use HTML::Parser ();

my $p = HTML::Parser->new(api_version => 3);
$p->handler( text => sub { }, "");
$p->handler( default => sub { print shift }, "text");
$p->parse_file('content.html') || die $!;
于 2013-10-23T19:13:54.090 回答
0

LibXML 可以轻松选择不是标签/注释/处理指令的内容并将其删除

#!/usr/bin/perl --
use strict;
use warnings;
use XML::LibXML 1.70; ## for load_html/load_xml/location
use XML::LibXML::PrettyPrint;

Main( @ARGV );
exit( 0 );
sub Main {
    binmode STDOUT;
    my $loc = shift or die "
Usage:
    $0  ko00010.html
    $0  http://example.com/ko00010.html\n\n";

    my $dom = XML::LibXML->new(
        qw/
          recover 2
          no_blanks 1
          /
    )->load_html( location => $loc, );

## http://www.w3.org/TR/xpath/#node-tests
## http://www.w3.org/TR/xpath/#NT-NodeType
## http://www.w3.org/TR/xpath/#section-Text-Nodes
    for my $text ( $dom->findnodes(q{ //text() }) ){
        node_detach( $text );
    }


    local $XML::LibXML::skipXMLDeclaration = 1; ## <?xml ?>
    local $XML::LibXML::setTagCompression = 0;  ## <p />

#~     print "$dom";

    my $pp  = XML::LibXML::PrettyPrint->new_for_html;
    $pp->{indent_string}=' ';
    print $pp->pretty_print( $dom );
}
sub node_detach {
    my( $self ) = @_;
    $self->parentNode->removeChild( $self );
}
于 2013-10-24T08:28:18.717 回答
0

你在找这个吗?

$string =~ s/>[^<]*</></mg;

或这个?

$string =~ s/(?<=>)[^<]*(?=<)//mg;
于 2013-10-22T23:45:52.117 回答