0

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

漢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]));

然后我阅读了规范,它说 mb_ereg_replace_callback 在 PHP 5.4.1 或更高版本中可用。

...任何想法我怎么能做到同样的事情?

4

5 回答 5

3

无需使用回调函数,单个正则表达式即可。

(?<=.).(?=.*@)
  • (?<=.), 确保之前至少有一个字符,这样它就不会替换第一个字符。
  • ., 匹配任何字符。
  • (?=.*@),确保@字符后面有一个。

将函数更改为preg_replace使用 unicode 修饰符的示例(如建议的那样):

echo preg_replace('/(?<=.).(?=.*@)/u','*','漢aelena@tratata.com');

输出:

漢******@tratata.com
于 2012-07-29T11:18:00.043 回答
1

您可以使用PCRE 系列preg_replace_callback()中的功能。您可以使用修饰符来支持 UTF-8。u

请注意,PCRE ( ) 和 POSIX ( ) 方式之间存在一些较小的差异,除了后者已被弃用。preg_ereg_

于 2012-07-29T10:50:13.430 回答
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
于 2012-07-29T10:53:33.750 回答
1

替换回调是一种选择。

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().

于 2012-07-29T11:01:25.557 回答
-1

当这可以更快地完成时,为什么还要使用正则表达式?

if(($pos = mb_strpos($email,'@')) > 0) {
    for($i=1;$i<=$pos;$i++) {
        $email[$i] = '*';
    }
}
于 2012-07-29T10:52:50.957 回答