这是相当简单的我想要实现,我想输入如
漢aelena@tratata.com
成为:
漢******@tratata.com
所以我做了这个正则表达式的第一个字符和“@”之间的匹配。
mb_regex_encoding ('UTF-8' );
mb_ereg_replace('(?<=^.{1}).*?(?=@)','*','漢aelena@tratata.com',1);
这个问题虽然,它只会匹配它一个时间,因而只会摆在那里的一个明星,而不是6。 这样的事情,是我会得到:
漢*@tratata.com
然后我想mb_ereg_replace_callback使用,返回:
return $matches[1].str_repeat('*', strlen($matches[1]));
然后我读的规格和它说mb_ereg_replace_callback是在PHP 5.4.1或更高版本可用。
...任何想法我怎么能做到同样的事情?
有没有必要使用一个回调函数,一个正则表达式可以做到这一点。
(?<=.).(?=.*@)
-
(?<=.)
请确保至少有一个字符之前,所以它不会取代第一个字符。 -
.
,匹配任何字符。 -
(?=.*@)
请确保有一个@
字符之后的某个地方。
与实施例的功能改变到preg_replace
使用Unicode改性剂(如建议的):
echo preg_replace('/(?<=.).(?=.*@)/u','*','漢aelena@tratata.com');
输出:
漢******@tratata.com
您可以使用preg_replace_callback()
函数从PCRE家庭 。 您可以使用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()
为什么要使用正则表达式在所有何时能更快地完成?
if(($pos = mb_strpos($email,'@')) > 0) {
for($i=1;$i<=$pos;$i++) {
$email[$i] = '*';
}
}