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