Я хочу заменить все, что не является тегом HTML из HTML-документа. Итак, в основном, пытаясь избавиться от всего текста внутри документа.
У меня есть следующее регулярное выражение для удаления всего HTML из строки, но вам нужна помощь с противоположным сценарием.
$string =~ s/<[^>]+>//g;
Благодарю.
Вы ищете это?
$string =~ s/>[^<]*</></mg;
Или это?
$string =~ s/(?<=>)[^<]*(?=<)//mg;
<!-- > --><p>
→ --><p>
и с тегами script
такими как <script> 2 < 4 </script>
→ <script>< 4 </script>
. Кроме того, текст в конце документа без явного <h1>Headline</h1><p>Text until EOF
или тела не удаляется: <h1>Headline</h1><p>Text until EOF
→ <h1></h1><p>Text until EOF
Если это regex s///ubstitution, чтобы удалить все html из документа
$string =~ s/<[^>]+>//g;
Затем вы можете использовать одно и то же регулярное выражение в am//atch-операторе, чтобы сохранить все html из документа
$string = join '', $string =~ m/<[^>]+>/g;
Если вышеупомянутое регулярное выражение удовлетворяет вашим требованиям, то вы закончили :) Но, возможно, вы хотите рассмотреть этот шаблон 'regex', немного длиннее: D http://perlmonks.org/?node_id=161281 Помните оговорки, такие как Ethan Browne упоминания :)
<!-- > -->
→ <!-- >
или <script> 3 < 4 </script>
→ <script>< 4 </script>
. Еще +1 за ссылку на лучшее регулярное выражение.
Этан Браун намечает HTML :: DOM, как если бы это было единственное решение CPAN.
HTML :: Parser более вездесущ, но это не сложно Google для большего.
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 );
}
<html><body>...
Этот синтаксический анализатор также придерживается семантики HTML4 (в отличие от HTML5) и вводит закрывающие теги там, где их не было в нашем входе.