正则表达式部分隐藏电子邮件?

时间:2012-07-29 10:40:39

标签: php regex utf-8

我想要实现的相当简单,我想要输入,如

漢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。

......任何想法我怎么能达到同样的目的?

5 个答案:

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