2013-06-23 4 views
4

сказать, у меня есть некоторые HTML, который из файла, который я сохранить в строке с помощью Perl, который выглядит следующим образомудаления HTML-код между двумя комментариями с Perl

<tbody> 
    <tr> 
    <td width="650"> 
    <!--MyComment--> 
     <a href="http://myurl.com"><img src="myimage.png" > </a> 
    <!--MyComment--> 
    </td> 
    </tr> 
    </tbody> 
... 
... 
... 

Что бы лучший способ удалить HTML-код между двумя комментариями Я думал об использовании модуля HTML :: tree perl

+4

Существует также «HTML :: Parser», вы можете взглянуть, но я не знаю, достаточно ли это для ваших нужд. Зависит от того, чего вы хотите достичь. Оставить документ как есть, за исключением тега 'a'? Что делать, если у вас есть 3 комментария? –

ответ

4

Одним из вариантов является использование парсинга вытягивания. Здесь у вас есть пример с HTML::TokeParser. Он использует две петли, первая используется для первого появления вашего комментария. Он печатает каждый тег, который он находит, пока не появится. Второй проходит все теги до второго появления такого же комментария и ничего не печатает.

Содержание script.pl:

#!/usr/bin/env perl 

use warnings; 
use strict; 
use HTML::TokeParser; 

my $p = HTML::TokeParser->new (shift); 
while (my $token = $p->get_token) { 
    printf qq|%s|, $token->[0] =~ m/S|E|PI/ ? $token->[ $#$token ] : $token->[1]; 
    if ($token->[0] eq q|C| && $token->[1] =~ m/(?i)MyComment/) { 
    ## Here begins the comment. 
     while (my $token2 = $p->get_token) { 
      if ($token2->[0] eq q|C| && $token2->[1] =~ m/(?i)MyComment/) { 
      ## Here ends the comment. 
       printf qq|%s|, $token2->[1]; 
       last; 
      } 
     } 
    } 
} 

Выполнить это нравится:

perl script.pl htmlfile 

, что урожайность:

<html> 
<head> 
<title>Title</title> 
</head> 
<body> 
<tbody> 
    <tr> 
    <td width="650"> 
    <!--MyComment--><!--MyComment--> 
    </td> 
    </tr> 
    </tbody> 
</body> 
</html> 
0

Вы также можете сделать это с помощью HTML::Restrict, который удаляет комментарии по умолчанию. Предостережение заключается в том, что с HTML :: Restrict вам необходимо явно указать все элементы и атрибуты HTML, которые вы хотите сохранить. Если вы просто хотите удалить комментарии, это, вероятно, не правильный модуль для вас, но если есть другие элементы, которые вам нужно удалить, когда вы на нем, возможно, стоит посмотреть.

+0

так хорошо звучит тоже, я посмотрю .. html :: tree может удалить узлы html, что в основном то, что я искал .. – user2429569

+0

Есть много способов сделать это, так что если вы уже нашел то, что работает для вас, это отлично. :) Просто хотел указать на этот инструмент для выхода за пределы вашего первоначального варианта использования. – oalders