我正在使用这个简单的代码:
$raw = 'text hi@li.com text';
$raw = preg_replace('<[\w.]+@[\w.]+>', '***@$2', $raw);
我应该得到输出,比如***@li.com
;当我得到***@
我无法调试它,我不知道怎么回事。
所以解决方案是
preg_replace('<([\w.]+)@([\w.]+)>', '***@$2', $raw);
我必须添加 () 才能组成一个组。
$raw = ' hi@li.com ';
$raw = preg_replace('/[^@]+@(.+)/', '***@$1', $raw);
您需要通过添加 () 创建一个组,顺便说一句,它将是 1 美元:
$raw = ' hi@li.com ';
$raw = preg_replace('/[^@]+@([^\s]+)/', '***@$1', $raw);
还修改了 .+ tp [^\s]+ 所以它只“吃”了电子邮件而不是它后面的文本
这里没有正则表达式:
$raw = 'hi@li.com';
$raw = explode('@', $raw);
array_shift($raw);
$raw = '***@'.implode('', $raw);
正则表达式对于这项任务来说有点矫枉过正。使用该explode()
函数和一点字符串连接就足够了。
$pieces = explode('@', $raw);
$raw = '***@' . $raw[count($raw) - 1];
请注意,我访问存储在$raw
. 我没有使用$raw[1]
,因为该@
字符实际上可以用作电子邮件地址(如果它被引号包围),尽管它实际上有点不寻常。您可以在此处查看更多电子邮件地址示例:http ://en.wikipedia.org/wiki/Email_address#Valid_email_addresses
您也可以使用strstr()函数。此外,使用真正的参数,您可以获得针前的部分并计算长度并用 asterix 填充。
<?php
$email = 'name@example.com';
$len = strlen(strstr($email, '@', true));
$domain = strstr($email, '@');
echo str_repeat('*',$len).$domain; // prints ****@example.com
?>