首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Perl删除HTML文件中p元素的所有属性?

如何使用Perl删除HTML文件中p元素的所有属性?
EN

Stack Overflow用户
提问于 2011-10-25 08:31:09
回答 4查看 1.1K关注 0票数 1

我想使用以下简单的Perl命令行删除<p>文件中的所有属性:

代码语言:javascript
复制
$ perl -pe 's/<p[^>]*>/<p>/' input.html

但是,它不能替代例如跨多行的<p class="hello">,例如

代码语言:javascript
复制
<p 
class="hello">

因此,我首先尝试删除行尾,方法是

代码语言:javascript
复制
# command-1
$ perl -pe 's/\n/ /' input.html > input-tmp.html
# command-2
$ perl -pe 's/<p[^>]*>/<p>/g' input-tmp.html > input-final.html

问题:

  1. 在(Perl) regex中是否有一个选项可以跨多行尝试匹配?
  2. 我能把上面的两个命令(命令-1和命令-2)合并成一个吗?基本上,第一个命令需要在第二个命令开始之前完成执行。
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-10-25 09:25:03

-p是缩写

代码语言:javascript
复制
LINE: while (<>) {
   ...
} continue {
   print
      or die "-p destination: $!\n";
}

如您所见,$_一次只包含一行,因此模式不可能匹配跨越多行的内容。您可以愚弄Perl,使其认为整个文件是使用-0777的一行。

代码语言:javascript
复制
perl -0777 -pe's/<p[^>]*>/<p>/g' input.html

命令行选项记录在perlrun中。

票数 3
EN

Stack Overflow用户

发布于 2011-10-25 13:25:46

如果您编写了一个简短的脚本,并将其放入自己的文件中,那么您可以使用一个简单的命令行轻松地调用它。

改进以下脚本是一项练习:

代码语言:javascript
复制
#!/usr/bin/perl

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

run(\@ARGV);

sub run {
    my ($argv, $opt) = @_;

    my $el = shift @$argv;

    for my $src (@$argv) {
        clean_attribs($src, $el, $opt);
    }
}

sub clean_attribs {
    my ($src, $el, $opt) = @_;
    my $el_pat = qr/^$el\z/;

    my $parser = HTML::TokeParser::Simple->new($src, %$opt);

    while (my $token = $parser->get_token) {
        if ($token->is_start_tag($el_pat)) {
            my $tag = $token->get_tag;
            print "<$tag>";
        }
        else {
            print $token->as_is;
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2011-10-25 13:54:58

perl -pe 'undef $/; s/<p[^>]*>/<p>/g'

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7886634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档