说我有一些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模块
答案 0 :(得分: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>
答案 1 :(得分:0)
您也可以使用HTML::Restrict执行此操作,默认情况下会删除注释。需要注意的是,使用HTML :: Restrict时,您需要明确允许您要保留的所有HTML元素和属性。如果您只是想删除评论,这可能不是适合您的模块,但如果您需要删除其他元素,则可能值得研究。