Perl Regex для не HTML

0

Я хочу заменить все, что не является тегом HTML из HTML-документа. Итак, в основном, пытаясь избавиться от всего текста внутри документа.

У меня есть следующее регулярное выражение для удаления всего HTML из строки, но вам нужна помощь с противоположным сценарием.

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

Благодарю.

  • 10
    Нееееееееееееееееееееееееееееееет !!!! stackoverflow.com/questions/1732348 / ...
  • 5
    Пожалуйста, не делай этого. Это путь к безумию
Показать ещё 7 комментариев
Теги:
tags

4 ответа

0
Лучший ответ

Вы ищете это?

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

Или это?

$string =~ s/(?<=>)[^<]*(?=<)//mg;
  • 3
    Ваше решение не работает с комментариями, такими как <!-- > --><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
1

Если это 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 упоминания :)

  • 0
    Эта идея (извлечение всех тегов) лучше, чем удаление чего-либо между тегами. Однако ваше регулярное выражение не выполняется для <!-- > --><!-- > или <script> 3 < 4 </script><script>< 4 </script> . Еще +1 за ссылку на лучшее регулярное выражение.
  • 0
    :) Вы уже сказали, что Amon, его OP регулярное выражение без изменений :)
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 $!;
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 );
}
  • 0
    Стоит отметить, что любое совместимое решение на основе DOM обернет фрагмент HTML внутри минимального фрагмента <html><body>... Этот синтаксический анализатор также придерживается семантики HTML4 (в отличие от HTML5) и вводит закрывающие теги там, где их не было в нашем входе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню