【问题标题】:How can I selectively modify the src attributes of script tags in an HTML document using Perl?如何使用 Perl 有选择地修改 HTML 文档中脚本标签的 src 属性?
【发布时间】:2012-06-30 10:13:29
【问题描述】:

我需要在 Perl 中编写一个正则表达式,它会在所有 src 前面加上 [perl]texthere[/perl],如下所示:

 <script src="[perl]texthere[/perl]/text"></script> 

有什么帮助吗?谢谢!

【问题讨论】:

标签: regex perl html-parsing html-parser


【解决方案1】:

使用适当的解析器,例如HTML::TokeParser::Simple:

#!/usr/bin/env perl

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

my $parser = HTML::TokeParser::Simple->new(handle => \*DATA);

while (my $token = $parser->get_token('script')) {
    if ($token->is_tag('script')
            and defined(my $src = $token->get_attr('src'))) {
            $src =~ m{^https?://}
                or  $token->set_attr('src', "[perl]texthere[/perl]$src");
    }
    print $token->as_is;
}

__DATA__
<script src="/js/text.text.js/"></script>

And at the same time, ignore scrs that begin with http, as such:

 <script src="https://websitewebsitewebsite"></script>

输出:



同时,忽略以 http 开头的 scrs,如下所示:

 

【讨论】:

    【解决方案2】:

    使用负前瞻模式(在下面的第三行):

    s{
      (<script\s+src\s*=\s*[\'"])
      (?!https?://)
    }{$1\[perl]texthere[/perl]}gsx;
    

    【讨论】:

    • 领先我 13 秒。 +1
    • 对不起,我是新手。如果我在 BBedit 中使用查找和替换,查找和替换字段中有什么内容?
    • 答案中提供的语法表示s{FIND}{REPLACE}。只需尝试一些变体。如果它允许 lookaround 断言,您可以在查找中检查(?&lt;=src=)(?!"https?),在替换部分检查[perl]texthere[/perl]。如果没有,我们会看到...
    【解决方案3】:

    我可以匹配任何 src=" 除了 http via: ^&lt;script src="(?!(https:)).*$ 如果有任何问题,请告诉我,我会解决。

    尝试使用:this website 作为正则表达式教程和this website 来测试正则表达式。

    【讨论】:

      【解决方案4】:

      这应该可行:

       s{(?<=src=)(?!"https?)}{[perl]texthere[/perl]}
      

      测试:

       my @olnk = ('<script src=/js/text.text.js/"></script>',
                   '<script src="https://websitewebsitewebsite"></script>' );
       my @nlnk = map {
                        s{(?<=src=)(?!"https?)}{[perl]texthere[/perl]}; $_
                      } @olnk;
      

      结果:

       print join "\n", @nlnk;
      
       <script src=[perl]texthere[/perl]/js/text.text.js/"></script>
       <script src="https://websitewebsitewebsite"></script>
      

      问候

      rbo

      【讨论】:

        猜你喜欢
        • 2017-02-20
        • 1970-01-01
        • 2013-09-21
        • 1970-01-01
        • 2015-03-13
        • 2012-11-12
        • 1970-01-01
        • 2011-02-25
        • 1970-01-01
        相关资源
        最近更新 更多