如何用PHP正则表达式部分隐藏电子邮件地址?

5

可能是重复问题:
正则表达式部分隐藏电子邮件?

我正在编写一个脚本来隐藏电子邮件地址(因此test@domain.com变为t~~~@~~~~~~.com)。

在遵循这个问题的说明时 - 正则表达式部分隐藏电子邮件? - 我已经成功地将其显示为t~~~@domain.com,但是无法删除“domain”。

这是我目前的代码(假设$row->email是“test@domain.com”):-

$string = preg_replace("(?<=.).(?=.*@)","~", $row->email);
$string = preg_replace("(?<=@).[a-zA-Z0-9]*","~", $string);

然而,它只返回t~~~@domain.com。我不知道如何获取其余的域名部分。有什么想法吗?如果有人能够提供解决方案,使其变成t~~~@d~~~~~~.com,那就太好了。谢谢。

最好干脆把地址删除。 - user557846
2个回答

5

这段代码涉及到 IT 技术,其作用是:

  • 匹配(并跳过)"@";
  • 匹配 .(任何字符,例如在 "domain" 中匹配到的字符 "d");
  • 匹配以下字符类的0 (零) 个字符,这是满足所提供正则表达式的最小值。

也就是说,只有第一个出现在 @ 后面的字符被匹配并替换成了 ~

下面是需要翻译的内容:

(?<=@.)[a-zA-Z0-9-]*(?=(?:[.]|$))

强制字符类匹配第一个“.”(即“.com”中的点)或输入结束。
请注意,“.”被移动到了“(?<=@.)”回顾后查找子句的内部,这导致它跳过了“@”后的第一个字母。我还在字符类中添加了连字符“-”,因为它们在域名中是有效的(而且并不常见)。
此外,并非所有电子邮件地址都以简单的“a@b.c”形式存在,国际化域名(IDN)可以在本地以非punycode形式表示,当未传输时(例如,在非限制性环境中未使用),但这是另一个话题。(由于IDN没有进一步的规定,将“[a-zA-Z0-9-]*”替换为“[^.]*”可能更合适。)

0

如果你愿意,也可以这样做,即使什么都没有,至少很容易阅读和修改:

$email = $row->email;
$atPos = strpos( $email, "@" );
preg_match('/(\..*?)$/', $email, $topDomain, PREG_OFFSET_CAPTURE);
$emailLength = strlen($email);

$hiddenEmail = $email[0] . 
               str_repeat('~', $atPos-1) . 
               "@" . 
               $email[$atPos + 1] . 
               str_repeat('~', $topDomain[1][1]-$atPos-2) . 
               $topDomain[1][0];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接