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

时间:2012-09-03 20:34:45

标签: php regex email

  

可能重复:
  regexp to partly hide email?

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

虽然按照此问题的说明进行操作 - regexp to partly hide email? - 我设法让它显示t〜~~ @ domain.com,但我在删除“域名”时遇到了问题。

这是我到目前为止(假设$ row->电子邮件是“test@domain.com”): -

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

然而,它返回的全部是t〜~~ @〜omain.com

我很困惑如何获得其余的域位。想法?

如果任何人都可以提供解决方案,那么它就会成为t〜~~ @ d〜~~~~~.com,那就是超级。

干杯

2 个答案:

答案 0 :(得分:5)

是......

  • 匹配(和跳过)"@"然后;
  • 匹配.(任何字符:即"d"中的"domain")然后;
  • 匹配以下字符类的 0(零),这是所需的最小值以匹配提供的正则表达式。

即{em>匹配并替换为@之后的第一个且仅第一个字符。

以下

~

强制字符类与第一个(?<=@.)[a-zA-Z0-9-]*(?=(?:[.]|$)) (句点,如".")或输入结束时匹配。

请注意,".com"在<{1}} - look-behind子句的内移动,导致它跳过.之后的第一个字母。我还在字符类中添加了一个连字符((?<=@.)),因为它们在域名中是有效的(并非非常罕见)。

此外,并非所有电子邮件地址都是简单的"@"表单,而Internationalized Domain Names (or IDN) 可以以非punycode形式在本地表示(例如,不在限制性上下文中使用),但这是另一个主题。 (在没有进一步说明的情况下,由于IDN而将"-"替换为"a@b.c"可能更为合适。)

答案 1 :(得分: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];