【问题标题】:remove html code between two comments with perl使用 perl 删除两个注释之间的 html 代码
【发布时间】:2013-06-19 23:55:14
【问题描述】:

假设我有一些 html 来自我使用 perl 保存在字符串中的文件,如下所示

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

删除两个 cmets 之间的 HTML 代码的最佳方法是什么 我正在考虑使用 HTML::tree perl 模块

【问题讨论】:

  • 还有HTML::Parser你可以看看,不过不知道能不能满足你的需求。取决于你想要达到什么。除了a 标记之外,保留文档原样吗?如果你有 3 个 cmets 怎么办?

标签: perl


【解决方案1】:

一种选择是使用拉式解析器。这里有一个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>

【讨论】:

    【解决方案2】:

    您也可以使用HTML::Restrict 执行此操作,默认情况下会删除 cmets。需要注意的是,使用 HTML::Restrict,您需要明确允许您希望保留的所有 HTML 元素和属性。如果您只是想删除 cmets,这可能不适合您,但如果您在使用它时需要删除其他元素,则可能值得研究。

    【讨论】:

    • 这种方式听起来也不错,我去看看.. html::tree 可以删除 html 节点,这基本上是我要找的..
    • 有很多方法可以完成这项工作,所以如果您已经找到适合您的方法,那就太好了。 :) 只是想指出这个工具超越了您的初始用例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 2018-03-16
    • 2013-09-23
    • 2021-04-12
    • 2011-07-23
    • 1970-01-01
    相关资源
    最近更新 更多