5

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

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

在遵循有关此问题的说明时 - 正则表达式部分隐藏电子邮件?- 我设法让它显示 t~~~@domain.com,但在删除“域”时遇到了麻烦。

这是我到目前为止所拥有的(假设 $row->email 是“test@domain.com”):-

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

然而,它返回的只是 t~~~@~omain.com

我对如何获得域的其余部分感到困惑。想法?

理想情况下,如果有人可以提供解决方案,使其变为 t~~~@d~~~~~~.com,那就太好了。

干杯

4

2 回答 2

5

这是 ..

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

也就是说,匹配后的第一个也是唯一的第一个字符@被匹配并替换为~.

以下

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

强制字符类匹配第一个"."(句".com"点,如 )或输入结尾。

请注意,将.移动到 -look-behind 子句内部,(?<=@.)会导致它跳过 . 之后的第一个字母"@"。我还在"-"字符类中添加了一个连字符 ( ),因为它们在域名中是有效的(并且并不少见)。

此外,并非所有电子邮件地址都采用普通"a@b.c"格式,并且国际化域名(或 IDN)在不传输时 可以在本地以非punycode形式表示(例如,未在限制性上下文中使用),但这是另一个主题。(由于 IDN 没有进一步说明,[a-zA-Z0-9-]*替换为可能更合适。)[^.]*

于 2012-09-03T20:43:52.880 回答
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];
于 2012-09-03T21:15:01.773 回答