【发布时间】:2012-06-30 10:13:29
【问题描述】:
我需要在 Perl 中编写一个正则表达式,它会在所有 src 前面加上 [perl]texthere[/perl],如下所示:
<script src="[perl]texthere[/perl]/text"></script>
有什么帮助吗?谢谢!
【问题讨论】:
标签: regex perl html-parsing html-parser
我需要在 Perl 中编写一个正则表达式,它会在所有 src 前面加上 [perl]texthere[/perl],如下所示:
<script src="[perl]texthere[/perl]/text"></script>
有什么帮助吗?谢谢!
【问题讨论】:
标签: regex perl html-parsing html-parser
使用适当的解析器,例如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,如下所示:
【讨论】:
使用负前瞻模式(在下面的第三行):
s{
(<script\s+src\s*=\s*[\'"])
(?!https?://)
}{$1\[perl]texthere[/perl]}gsx;
【讨论】:
s{FIND}{REPLACE}。只需尝试一些变体。如果它允许 lookaround 断言,您可以在查找中检查(?<=src=)(?!"https?),在替换部分检查[perl]texthere[/perl]。如果没有,我们会看到...
我可以匹配任何 src=" 除了 http via: ^<script src="(?!(https:)).*$
如果有任何问题,请告诉我,我会解决。
尝试使用:this website 作为正则表达式教程和this website 来测试正则表达式。
【讨论】:
这应该可行:
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
【讨论】: