这很简单,我想要之类的输入
漢aelena@tratata.com
将:
漢******@tratata.com
所以我制作了这个regexp来匹配第一个字符和"@"。
mb_regex_encoding ('UTF-8' );
mb_ereg_replace('(?<=^.{1}).*?(?=@)','*','漢aelena@tratata.com',1);
然而,问题是,它只会匹配它一次,因此只会在那里放一颗星,而不是六颗星。我会得到这样的东西:
漢*@tratata.com
然后我想使用mb_ereg_replace_callback,返回:
return $matches[1].str_repeat('*', strlen($matches[1]));
然后我阅读了规范,它说mb_ereg_replace_callback在PHP 5.4.1或更高版本中可用。
有什么想法可以让我实现同样的目标吗?
不需要使用回调函数,一个正则表达式就可以完成
(?<=.).(?=.*@)
(?<=.)
,确保之前至少有一个字符,这样它就不会取代第一个字符.
,匹配任意字符(?=.*@)
,确保字符后面有一个@
使用unicode修饰符将函数更改为preg_replace
的示例(如建议):
echo preg_replace('/(?<=.).(?=.*@)/u','*','漢aelena@tratata.com');
输出:
漢******@tratata.com
您可以使用PCRE系列中的preg_replace_callback()
函数。您可以使用u
修饰符来支持UTF-8。
请注意,PCRE(preg_
)和POSIX(ereg_
)方式之间有一些较小的差异,除了后者不推荐使用之外。
<?php
$email = '漢aelena@tratata.com';
$email = preg_replace_callback('#^(.){1}(.*?)@#u', function($matches)
{
return $matches[1] . str_repeat('*', mb_strlen($matches[2])) . '@';
},
$email);
echo $email; # 漢******@tratata.com
替换回调是一个选项。
echo preg_replace_callback('/(?<=^.).+(?=@)/u', function($match) {
return str_pad('', strlen($match[0]), '*');
}, "something@something.com");
//s*******@something.com
注意,我使用了一个匿名函数作为回调-这只是PHP>=5.3。如果您在<5.3,使用命名函数或使用function_create()
创建的函数。
既然可以更快地完成,为什么还要使用regexp?
if(($pos = mb_strpos($email,'@')) > 0) {
for($i=1;$i<=$pos;$i++) {
$email[$i] = '*';
}
}