Как я могу заменить произвольное количество обратных условий в SED или Perl? (для запутанного mailto)
Вопрос
Я ищу способ перевозить Mailtos в исходном коде веб-сайта. Я хотел бы пойти от этого:
href="mailto:president@whitehouse.gov"
К этому:
href="" onmouseover="this.href='mai'+'lto:'+'pre'+'sid'+'ent'+'@wh'+'ite'+'hou'+'se.'+'gov'"</code>
Я, вероятно, собираюсь пойти с решением PHP вместо этого, как это (Таким образом, мне нужно только глобально заменить весь mailto, и источник на моем конце будет выглядеть лучше), но я провел слишком много времени, глядя на СОД и Perl, и теперь я не могу перестать думать о том, как это можно сделать! Есть идеи?
Обновлять: Основанно на основе решения Eclark, я в конечном итоге придумал это:
#!/usr/bin/env perl -pi
if (/href="mailto/i) {
my $start = (length $`) +6;
my $len = index($_,'"',$start)-$start;
substr($_,$start,$len,'" onmouseover="this.href=' .
join('+',map qq{'$_'}, substr($_,$start,$len) =~ /(.{1,3})/g));
}
Решение
Здание на идее Sinan, вот короткий сценарий Perl, который будет обработать файловую строку по строке.
#!/usr/bin/env perl -p
my $start = index($_,'href="') +6;
my $len = index($_,'"',$start)-$start;
substr($_,$start,$len+1,'" onmouseover="this.href=' .
join('+',map qq{'$_'}, substr($_,$start,$len) =~ /(.{1,3})/g)
);
Если вы собираетесь использовать его, убедитесь, что у вас есть старые файлы, приверженные для исходного управления, и измените параметр -P -P -I, которая будет переписать файл на месте.
Другие советы
#!/usr/bin/perl
use strict; use warnings;
my $s = 'mailto:president@whitehouse.gov';
my $obfuscated = join('+' => map qq{'$_'}, $s =~ /(.{1,3})/g );
print $obfuscated, "\n";
Выход:
«Mai '+' LTO '+': pr'+'esi'eh''den'+'t @w'+'hit'eh'o'o'oje''us
Обратите внимание, что 'lto:
Четыре символа, тогда как похоже, вы хотите три группы персонажей.
Это достаточно близко?
use strict;
use warnings;
my $old = 'href="mailto:president@whitehouse.gov"';
$old =~ s/href="(.*)"/$1/;
my $new = join '+', map { qq('$_') } grep { length $_ } split /(.{3})/, $old;
$new = qq(href=""\nonmouseover="this.href=$new\n");
print "$new\n";
__END__
href=""
onmouseover="this.href='mai'+'lto'+':pr'+'esi'+'den'+'t@w'+'hit'+'eho'+'use'+'.go'+'v'
"
Просто пример.
$ echo $s
href="mailto:president@whitehouse.gov"
$ echo $s | sed 's|\(...\)|\1+|g' | sed 's/hre+f=\"/href="" onmouseover="this.href=/'
href="" onmouseover="this.href=+mai+lto+:pr+esi+den+t@w+hit+eho+use+.go+v"
Акл! Thpffft! Я предлагаю вам эту фотографию:
s='href="mailto:president@whitehouse.gov"'
echo "$s" | sed -n 's/=/=\x22\x22\n/;
h;
s/\n.*//;
x;
s/[^\n]*\n//;
s/"//g;
s/\(...\)/\x27&\x27+/g;
s/.*/onmouseover=\x22this.href=&\x22/;
x;
G;
s/\n//2;
s/+\([^\x22]\{1,2\}\)\x22$/+\x27\1\x27\x22/;
s/+\x22$/\x22/;
p'