我想要实现的相当简单,我想要输入,如
漢aelena@tratata.com
是:
漢******@tratata.com
所以我制作了这个正则表达式,以匹配第一个字符和'@'。
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]));
然后我读了规范,并说它在PHP 5.4.1或更高版本中可以使用mb_ereg_replace_callback。
......任何想法我怎么能达到同样的目的?
答案 0 :(得分:3)
不需要使用回调函数,单个正则表达式就可以做到。
(?<=.).(?=.*@)
(?<=.)
,请确保之前至少有一个字符,因此不会替换第一个字符。.
,匹配任何角色。(?=.*@)
,确保在角色后面某处@
。使用unicode修饰符(如建议)将函数更改为preg_replace
的示例:
echo preg_replace('/(?<=.).(?=.*@)/u','*','漢aelena@tratata.com');
输出:
漢******@tratata.com
答案 1 :(得分:1)
您可以使用preg_replace_callback()
中的PCRE family功能。您可以使用u
modifier来支持UTF-8。
请注意,PCRE(preg_
)和POSIX(ereg_
)方式之间有some smaller differences,除了后者已被弃用。
答案 2 :(得分:1)
<?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
答案 3 :(得分:0)
替换回调是一种选择。
echo preg_replace_callback('/(?<=^.).+(?=@)/u', function($match) {
return str_pad('', strlen($match[0]), '*');
}, "something@something.com");
//s*******@something.com
注意我使用匿名函数作为回调 - 这只是PHP&gt; = 5.3。如果你在&lt; 5.3,使用命名函数或使用function_create()
创建的函数。
答案 4 :(得分:-1)
为什么可以更快地使用regexp?
if(($pos = mb_strpos($email,'@')) > 0) {
for($i=1;$i<=$pos;$i++) {
$email[$i] = '*';
}
}