كيف يمكنني استبدال عدد تعسفي من الخلفية في SED أو Perl؟ (لالتقاط Mailto)

StackOverflow https://stackoverflow.com/questions/3432752

  •  26-09-2019
  •  | 
  •  

سؤال

أنا أبحث عن وسيلة لإلغاء mailtos في الكود المصدري لموقع الويب. أود أن أذهب من هذا:

href="mailto:president@whitehouse.gov"

الى هذا:

href="" onmouseover="this.href='mai'+'lto:'+'pre'+'sid'+'ent'+'@wh'+'ite'+'hou'+'se.'+'gov'"</code>

ربما سأذهب مع حل PHP بدلاً من ذلك ، مثل هذه (وبهذه الطريقة ، لا بد لي من استبدال Mailto بالكامل على مستوى العالم ، وسيبدو المصدر في نهايتي بشكل أفضل) ، لكنني قضيت الكثير من الوقت في النظر إلى SED و 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));
}
هل كانت مفيدة؟

المحلول

بناءً على فكرة سنان ، إليك نصًا قصيرًا بيرل سيعالج سطر الملف سطرًا.

#!/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 إلى -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'+'den'+'t@w'+'hit'+'eho'+'use'+'.go'+'v'

لاحظ أن '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"

ACK! thppfft! أقدم لكم كرة الشعر هذه:

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'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top