Regex 如何替换sed或Perl中任意数量的反向引用?(用于混淆邮件)

Regex 如何替换sed或Perl中任意数量的反向引用?(用于混淆邮件),regex,perl,sed,mailto,Regex,Perl,Sed,Mailto,我正在寻找一种在网站源代码中混淆mailtos的方法。我想从这里开始: href="mailto:president@whitehouse.gov" 为此: href="" onmouseover="this.href='mai'+'lto:'+'pre'+'sid'+'ent'+'@wh'+'ite'+'hou'+'se.'+'gov'"</code> 我可能会转而使用PHP解决方案,比如(这样我只需要全局替换整个mailto,我端的源代码看起来会更好),但我花了太多时间研究s

我正在寻找一种在网站源代码中混淆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));
}
输出:

'mai'+'lto'+':pr'+'esi'+'den'+'t@w'+'hit'+'eho'+'use'+'.go'+'v' 'mai'+'lto'+':pr'+'esi'+'den'+'t@w“+”打“+”eho“+”用“+”.走“+”v” 请注意,
'lto:
是四个字符,而看起来您需要三个字符组。

只是一个示例

$ 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"
这够近吗

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'
"

基于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选项更改为-i,这将在适当的位置重写文件。

我为您提供了以下建议:

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'

别开玩笑!我可以理解为什么要编写perl,尽管它仍然以比Steve Dallas的脚更脏而闻名……哦,等等。。。我刚刚注意到了八进制。你是不是特意把这件事弄得尽可能模糊不错!如果字符串实际上可以被3整除,那么在末尾会有一个额外的加号,而您必须用另一个sed进行替换吗?并不是说我在烦你;这只是一个例子:)是的,这只是一个例子。我不想深入细节,因为我想让OP自己做,如果他愿意的话;非常感谢您的回复!这是我第一次看的,为了试着理解其他人:)我不认为我想要额外的新词,我喜欢希南避开额外的grep。但我确实有一个问题;为什么拆分需要grep来实现我们想要的行为?从技术上讲,是因为匹配的字符串是空字符串的分隔符吗?不客气。额外的换行符用于尝试匹配您的输出。我也比我更喜欢思南的解决方案。我把我的放在这里只是因为它展示了如何处理href(Sinan没有)。您是正确的:需要丑陋的
grep
/
长度
来过滤掉
split
返回的空字符串<代码>拆分使用parens保留分隔符。太好了!很抱歉,我没有明确地说,我实际上也不知道如何获得我想要的perl字符串。。。但是你读懂了我的想法,并把额外的功能放了下来:)我想你在第一个子序列中有一个额外的+1。我还添加了案例不敏感。哦,我在匹配字符串中添加了mailto,以避免对所有链接执行相同的操作,这样页面至少可以在没有JS的情况下工作并可以爬行。最后,只是perl——我似乎什么都没做;only-pi实际上是在文件中循环的…?哇,perl highlighter真的很讨厌这种背景!
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'