如何使用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)
将开始和结束处理程序添加到解析器中,并让它们记录当前元素的祖先。当祖先包含
或
时,禁用重写
保持冷静
#! /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>