2012-06-28 6 views
2

мне нужно написать регулярное выражение в Perl, который будет префиксом всех Суданского Красного Полумесяца с [Perl] texthere [/ Perl], как, например:Как я могу выборочно модифицировать атрибуты src тегов скриптов в HTML-документе с использованием Perl?

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

Любой помощью? Благодаря!

+0

Возможный дубликат http://stackoverflow.com/questions/11247071 – dgw

ответ

1

Используйте отрицательный образец опережения (на третьей строке ниже):

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

Избили меня к нему на 13 секунд. +1 – BlackVegetable

+0

Извините, я новичок в этом. Если я использую поиск и замену в BBedit, что происходит в области поиска и замены? – eggplantkiller

+0

Синтаксис, указанный в ответах, означает 's {FIND} {REPLACE}'. Просто попробуйте несколько вариантов. Если он позволяет утверждать * lookaround *, вы можете проверить '(? <= Src =) (?!" https?) 'В поиске и' [perl] texthere [/ perl] 'в части замены.Если нет, мы увидим ... –

0

Я могу соответствовать любой SRC =», за исключением HTTP через: ^<script src="(?!(https:)).*$ Дайте мне знать, если есть какие-либо вопросы, и я будет это исправить

Попробуйте использовать:.. this website как регулярное выражение учебник и this website для тестирования регулярных выражений

2

Используйте надлежащий анализатор, такие как 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> 

Выход:

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

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

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

Это должно работать:

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