正则表达式部分地隐藏电子邮件? [关闭](regexp to partly hide email

2019-07-30 16:11发布

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

漢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或更高版本可用。

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

Answer 1:

有没有必要使用一个回调函数,一个正则表达式可以做到这一点。

(?<=.).(?=.*@)
  • (?<=.)请确保至少有一个字符之前,所以它不会取代第一个字符。
  • . ,匹配任何字符。
  • (?=.*@)请确保有一个@字符之后的某个地方。

与实施例的功能改变到preg_replace使用Unicode改性剂(如建议的):

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

输出:

漢******@tratata.com


Answer 2:

您可以使用preg_replace_callback()函数从PCRE家庭 。 您可以使用u 修改以支持UTF-8。

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



Answer 3:

<?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


Answer 4:

一个替代的回调是一个选项。

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



Answer 5:

为什么要使用正则表达式在所有何时能更快地完成?

if(($pos = mb_strpos($email,'@')) > 0) {
    for($i=1;$i<=$pos;$i++) {
        $email[$i] = '*';
    }
}


文章来源: regexp to partly hide email? [closed]
标签: php regex utf-8