1

我正在使用这个简单的代码:

$raw = 'text hi@li.com text';
$raw = preg_replace('<[\w.]+@[\w.]+>', '***@$2', $raw);

我应该得到输出,比如***@li.com;当我得到***@

我无法调试它,我不知道怎么回事。


所以解决方案是

preg_replace('<([\w.]+)@([\w.]+)>', '***@$2', $raw);

我必须添加 () 才能组成一个组。

4

5 回答 5

3
$raw = ' hi@li.com ';
$raw = preg_replace('/[^@]+@(.+)/', '***@$1', $raw);
于 2012-04-15T09:31:51.567 回答
3

您需要通过添加 () 创建一个组,顺便说一句,它将是 1 美元:

$raw = ' hi@li.com ';
$raw = preg_replace('/[^@]+@([^\s]+)/', '***@$1', $raw);

还修改了 .+ tp [^\s]+ 所以它只“吃”了电子邮件而不是它后面的文本

于 2012-04-15T09:33:50.817 回答
1

这里没有正则表达式:

$raw = 'hi@li.com';
$raw = explode('@', $raw);
array_shift($raw);
$raw = '***@'.implode('', $raw);
于 2012-04-15T09:32:19.497 回答
0

正则表达式对于这项任务来说有点矫枉过正。使用该explode()函数和一点字符串连接就足够了。

$pieces = explode('@', $raw);
$raw = '***@' . $raw[count($raw) - 1];

请注意,我访问存储在$raw. 我没有使用$raw[1],因为该@字符实际上可以用作电子邮件地址(如果它被引号包围),尽管它实际上有点不寻常。您可以在此处查看更多电子邮件地址示例:http ://en.wikipedia.org/wiki/Email_address#Valid_email_addresses

于 2012-04-15T09:38:11.280 回答
0

您也可以使用strstr()函数。此外,使用真正的参数,您可以获得针前的部分并计算长度并用 asterix 填充。

<?php
$email  = 'name@example.com';

$len = strlen(strstr($email, '@', true));
$domain = strstr($email, '@');

echo str_repeat('*',$len).$domain; // prints ****@example.com
?>
于 2012-04-15T10:22:56.570 回答