如何使用HTML::Parser重写HTML的文本部分而不改变<;脚本>;及<;头>;部分?

如何使用HTML::Parser重写HTML的文本部分而不改变<;脚本>;及<;头>;部分?,html,perl,Html,Perl,以下代码是的缩写版本 这段代码运行得很好,但它有一个缺点,即它还重写了和节中的文本。我已经修改了上面的例子来做我想做的事情,但不幸的是,还有一个bug,它重写了标记中的文本等我不想重写的内容 是否有人知道如何编写类似上述内容,但又不破坏JavaScript、或其他部分?如果需要,我很乐意使用除HTML::Parser之外的另一个模块。查看您现有的代码,我不确定您的问题出在哪里: 添加一堆布尔值 my @do_edit = (0) 在“编辑打印”中,如果$do\u edit[0]为0,则不进行

以下代码是的缩写版本

这段代码运行得很好,但它有一个缺点,即它还重写了
节中的文本。我已经修改了上面的例子来做我想做的事情,但不幸的是,还有一个bug,它重写了
标记中的文本等我不想重写的内容


是否有人知道如何编写类似上述内容,但又不破坏JavaScript、
或其他部分?如果需要,我很乐意使用除HTML::Parser之外的另一个模块。

查看您现有的代码,我不确定您的问题出在哪里:

  • 添加一堆布尔值

    my @do_edit = (0)
    
  • 在“编辑打印”中,如果$do\u edit[0]为0,则不进行编辑

  • 添加start_h和end_h处理程序以移动/取消移动某些元素名称的值


  • 将开始和结束处理程序添加到解析器中,并让它们记录当前元素的祖先。当祖先包含
    时,禁用重写

    保持冷静

    #! /usr/bin/perl
    
    use warnings;
    use strict;
    
    use HTML::Parser 3.05;
    
    sub edit_print { local $_ = shift; tr/a-z/n-za-m/; print }
    
    并使用以下子项创建新的解析器:

    sub create_parser {
      my @tags;
      my $start = sub {
        my($text,$tagname) = @_;
        push @tags => $tagname;
        print $text;
      };
      my $end = sub {
        my($text,$tagname) = @_;
        die "$0: expected </$tags[-1]>, got </$tagname>"
          unless $tagname eq $tags[-1];
        pop @tags;
        print $text;
      };
      my $edit_print = sub {
        if (grep /^(head|script)$/, @tags) { print @_ }
        else                               { edit_print @_ }
      };
    
      HTML::Parser->new(
        unbroken_text => 1,
        default_h     => [ sub { print @_ }, "text" ],
        text_h        => [ $edit_print,      "text" ],
        start_h       => [ $start,           "text,tagname" ],
        end_h         => [ $end,             "text,tagname" ],
      );
    }
    
    输出:

    sbb
    <html>
    <head>
    <title>My Title</title>
    <style type="text/css">
      /* don't change me */
    </style>
    </head>
    <body>
    <script type="text/javascript">
      // or me
    </script>
    <h1>Ml Dbphzrag</h1>
    <p>Yb.</p>
    </body>
    </html>
    
    sbb
    我的头衔
    /*不要改变我*/
    //还是我
    Ml-Dbphzrag
    Yb

    my $p = create_parser;
    $p->parse_file(\*DATA);
    
    __DATA__
    foo
    <html>
    <head>
    <title>My Title</title>
    <style type="text/css">
      /* don't change me */
    </style>
    </head>
    <body>
    <script type="text/javascript">
      // or me
    </script>
    <h1>My Document</h1>
    <p>Yo.</p>
    </body>
    </html>
    
    sbb
    <html>
    <head>
    <title>My Title</title>
    <style type="text/css">
      /* don't change me */
    </style>
    </head>
    <body>
    <script type="text/javascript">
      // or me
    </script>
    <h1>Ml Dbphzrag</h1>
    <p>Yb.</p>
    </body>
    </html>