regexp部分隐藏电子邮件


regexp to partly hide email?

这很简单,我想要之类的输入

漢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] = '*';
    }
}