我希望从 HTML 文档中替换不是 HTML 标记的任何内容。所以,基本上试图摆脱文档中的所有文本。
我有下面的正则表达式来从字符串中删除所有 HTML,但在相反的情况下需要帮助。
$string =~ s/<[^>]+>//g;
谢谢。
如果这是正则表达式 s///从文档中删除所有 html 的替换
$string =~ s/<[^>]+>//g;
然后您可以在 am//atch 运算符中使用相同的正则表达式来保留文档中的所有 html
$string = join '', $string =~ m/<[^>]+>/g;
如果上面的正则表达式满足您的要求,那么您就完成了:) 但也许您想考虑这个 ol' 正则表达式模式,稍微长一点:D http://perlmonks.org/?node_id=161281 请注意像 Ethan Browne 提到的警告:)
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 $!;
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 );
}
你在找这个吗?
$string =~ s/>[^<]*</></mg;
或这个?
$string =~ s/(?<=>)[^<]*(?=<)//mg;