用于非HTML的Perl正则表达式

用于非HTML的Perl正则表达式,html,regex,perl,tags,Html,Regex,Perl,Tags,我希望从HTML文档中替换任何不是HTML标记的内容。因此,基本上是试图去除文档中的所有文本 我有下面的正则表达式来删除字符串中的所有HTML,但需要与此相反的场景的帮助 $string =~ s/<[^>]+>//g; 谢谢。你在找这个吗 $string =~ s/>[^<]*</></mg; 还是这个 $string =~ s/(?<=>)[^<]*(?=<)//mg; Ethan Brown检查HTML::DOM

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

我有下面的正则表达式来删除字符串中的所有HTML,但需要与此相反的场景的帮助

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

谢谢。

你在找这个吗

$string =~ s/>[^<]*</></mg;
还是这个

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

Ethan Brown检查HTML::DOM,就好像它是唯一的CPAN解决方案一样

解析器更为普遍,但在谷歌上搜索更多并不困难

使用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 $!;
如果这是regex s///从文档中删除所有html的替换

$string =~ s/<[^>]+>//g;
$string = join '', $string =~ m/<[^>]+>/g;
然后,您可以在m//atch操作符中使用相同的正则表达式来保存文档中的所有html

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

如果上面的正则表达式满足你的要求,那么你已经完成了:但是也许你想考虑这个OL’正则表达式,稍微长一点:D


请注意Ethan Browne提到的注意事项:

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 );
}

不!!!!请不要这样做。这就是在HTML文档中不使用HTML标记的方法?如果格式良好,则除了注释之外的所有内容都会包含在某种标记中。你是在寻找正文中的文本而不是另一个标记中的文本吗?@Ethan Brown:是的,是在寻找消除HTML标记之外的文本。你没有真正回答我的问题。例如,如果这是您的文档:这里有一些粗体文本!,你在找字符串吗?这是一些字符串和文本!?因为这两个字符串都不在HTML标记外,它们都在标记内。您的解决方案在出现类似->→ -> 在脚本标记上,如2<4→ < 4.此外,文档末尾没有明确标题或正文的文本不会被删除:Headlinetext直到EOF→ 提取所有标记比删除标记之间的任何内容都要好。但是,您的正则表达式在->→ 或3<4→ < 4.仍然+1用于链接到更好的正则表达式:您已经说过amon,它的OPs正则表达式保持不变:值得注意的是,任何兼容的基于DOM的解决方案都会将HTML片段封装在最小的。。。碎片与HTML5相比,该解析器还坚持HTML4语义,并将在输入中没有任何结束标记的地方引入结束标记。