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

Rhy*_*nne 4 php regex email

可能重复:
regexp部分隐藏电子邮件?

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

按照这个问题的说明 - regexp部分隐藏电子邮件? - 我设法让它显示t ~~~ @ domain.com,但是在删除"域名"时遇到了问题.

这是我到目前为止(假设$ row-> email是"test@domain.com"): -

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

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

我很困惑如何获得域的其余部分.想法?

理想的是,如果任何人都可以提供解决方案,那就变成t ~~~~~~~~~~~,那就是超级.

干杯

小智 5

它是 ..

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

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

下列

(?<=@.)[a-zA-Z0-9-]*(?=(?:[.]|$))
Run Code Online (Sandbox Code Playgroud)

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

需要注意的是,.移动内部的的(?<=@.)-Look隐藏条款,使其后跳过的第一个字母"@".我还在"-"字符类中添加了一个连字符(),因为它们在域名中是有效的(并非非常罕见).

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