【发布时间】:2012-09-17 12:37:39
【问题描述】:
是否有 php 专用的电子邮件地址混淆器功能?在网上找到的大多数是 JS 和 PHP 的混合体。
【问题讨论】:
-
您的意思是在将真实电子邮件地址发送给您之前需要填写验证码? ;)
标签: php email obfuscation
是否有 php 专用的电子邮件地址混淆器功能?在网上找到的大多数是 JS 和 PHP 的混合体。
【问题讨论】:
标签: php email obfuscation
这是我使用的几个函数。
第一个使用 html 字符代码混淆电子邮件地址:
function getObfuscatedEmailAddress($email)
{
$alwaysEncode = array('.', ':', '@');
$result = '';
// Encode string using oct and hex character codes
for ($i = 0; $i < strlen($email); $i++) {
// Encode 25% of characters including several that always should be encoded
if (in_array($email[$i], $alwaysEncode) || mt_rand(1, 100) < 25) {
if (mt_rand(0, 1)) {
$result .= '&#' . ord($email[$i]) . ';';
} else {
$result .= '&#x' . dechex(ord($email[$i])) . ';';
}
} else {
$result .= $email[$i];
}
}
return $result;
}
例子:
echo getObfuscatedEmailAddress('firstname.last-name@example.com');
-->
firstname.last-name@example.com
第二个将返回电子邮件地址为 html 和 url 编码的链接:
function getObfuscatedEmailLink($email, $params = array())
{
if (!is_array($params)) {
$params = array();
}
// Tell search engines to ignore obfuscated uri
if (!isset($params['rel'])) {
$params['rel'] = 'nofollow';
}
$neverEncode = array('.', '@', '+'); // Don't encode those as not fully supported by IE & Chrome
$urlEncodedEmail = '';
for ($i = 0; $i < strlen($email); $i++) {
// Encode 25% of characters
if (!in_array($email[$i], $neverEncode) && mt_rand(1, 100) < 25) {
$charCode = ord($email[$i]);
$urlEncodedEmail .= '%';
$urlEncodedEmail .= dechex(($charCode >> 4) & 0xF);
$urlEncodedEmail .= dechex($charCode & 0xF);
} else {
$urlEncodedEmail .= $email[$i];
}
}
$obfuscatedEmail = getObfuscatedEmailAddress($email);
$obfuscatedEmailUrl = getObfuscatedEmailAddress('mailto:' . $urlEncodedEmail);
$link = '<a href="' . $obfuscatedEmailUrl . '"';
foreach ($params as $param => $value) {
$link .= ' ' . $param . '="' . htmlspecialchars($value). '"';
}
$link .= '>' . $obfuscatedEmail . '</a>';
return $link;
}
例子:
echo getObfuscatedEmailLink('firstname.last-name@example.com');
-->
<a href="mailto:%66i%72stna%6de.%6c%61st-name@example.com" rel="nofollow">firstname.last-name@example.com</a>
【讨论】:
我的最爱:
标记 + PHP
<span class="rev"><?php echo strrev($email); ?> </span>
CSS
.rev{
direction: rtl;
unicode-bidi: bidi-override;
}
【讨论】:
if (email.indexOf('.') < email.indexOf('@')) email.reverse()
这是另外一种方法,它非常严格并且不会导致https://validator.w3.org 出错
function obfuscate($email){
$encoded_email = '';
for ($a = 0,$b = strlen($email);$a < $b;$a++)
{
$encoded_email .= '&#'.(mt_rand(0,1) == 0 ? 'x'.dechex(ord($email[$a])) : ord($email[$a])) . ';';
}
return $encoded_email;}
然后添加到页面使用:
<a href="mailto:<?= obfuscate(CONTACT_EMAIL.'?subject=Hello!') ?>"><?= CONTACT_EMAIL ?></a>
【讨论】:
这里有一个 PHP 7 类型提示。
只需使用$this->obfuscateEmail($email); 调用它
/**
* @param string $email
* @return string
*/
private function obfuscateEmail(string $email) : string
{
$em = explode("@", $email);
$name = implode(array_slice($em, 0, count($em) - 1), '@');
$len = floor(strlen($name) / 2);
return substr($name, 0, $len) . str_repeat('*', $len) . "@" . end($em);
}
【讨论】:
如果主机之前有一个字符,这是另一种方法:
/**
* @param string $email
* @return string
*/
private function obfuscateEmail($email)
{
$em = explode("@", $email);
$name = implode(array_slice($em, 0, count($em)-1), '@');
if(strlen($name)==1){
return '*'.'@'.end($em);
}
$len = floor(strlen($name)/2);
return substr($name,0, $len) . str_repeat('*', $len) . "@" . end($em);
}
【讨论】: