作者:zhanhailiang 日期:2013-04-26
目的
避免显示的邮箱地址被address-harvesting spambots(邮箱地址收集爬虫)收集。当然,以下这种方式只能避免一部分的爬虫收集,仍然还有些高级爬虫可以收集到。
实现
<?php
function hexentities($str) {
$return = '';
for($i = 0; $i < strlen($str); $i++) {
$return .= '&#x'.bin2hex(substr($str, $i, 1)).';';
}
return $return;
}
echo hexentities("mailto:address@example.com").PHP_EOL;
echo hexentities("address@example.com").PHP_EOL;
// mailto:address@example.com
// address@example.com
<p><a href="mailto:address@example.com">address@example.com</a></p>
实际解析显示为:
<p><a href="mailto:address@example.com">address@example.com</a></p>
更进一步,可以参考Markdown AUTOMATIC LINKS对邮箱的自动链接处理:
Automatic links for email addresses work similarly, except that Markdown will also perform a bit of randomized decimal and hex entity-encoding to help obscure your address from address-harvesting spambots.
简单说,Markdown对邮箱进入十六进制编码时引用了随机性,增强防恶意收集的能力。
如下为其编码结果:
<p><a href="mailto:address@example.com">address@example.com</a></p>
可以看出,蓝色标记的字符并没有进行十六进制编码。
对Markdown对邮箱地址的自动链接算法有兴趣的同学请参考Markdown包里的源码Markdown.pl:
1167 sub _DoAutoLinks { 1168 my $text = shift; 1169 1170 $text =~ s{<((https?|ftp):[^'">\s]+)>}{<a href="$1">$1</a>}gi; 1171 1172 # Email addresses: <address@domain.foo> 1173 $text =~ s{ 1174 < 1175 (?:mailto:)? 1176 ( 1177 [-.\w]+ 1178 \@ 1179 [-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+ 1180 ) 1181 > 1182 }{ 1183 _EncodeEmailAddress( _UnescapeSpecialChars($1) ); 1184 }egix; 1185 1186 return $text; 1187 }
参考: