我目前正在编写一个隐藏电子邮件地址的脚本(因此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,那就是超级。
干杯
答案 0 :(得分:5)
是......
"@"
然后; .
(任何字符:即"d"
中的"domain"
)然后; 即{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];