在行的中间用*替换一定数量的字符

时间:2017-08-24 10:53:10

标签: php regex preg-replace

我希望将 example@gmail.com 更改为 ex ***** @ gmail.com 以获得相同数量的*因为符号被替换了。

我应该如何更改此代码?

preg_replace("/([_a-zA-Z0-9-]{2})([-a-z0-9]*)(@[_a-zA-Z0-9-]+)/i", "$1****$3", $model->email);

3 个答案:

答案 0 :(得分:3)

使用preg_replace_callback

$s = "example@gmail.com";
$s = preg_replace_callback(
    "/([\w-]{2})([-a-z0-9]*)(@[\w-]+)/i", 
    function ($m) { return $m[1] . str_repeat("*", strlen($m[2])). $m[3]; }, 
    $s);
echo $s; // => ex*****@gmail.com

请参阅PHP demo

详细说明:

  • [_a-zA-Z0-9]可以替换为\w
  • function($m) {...}是一个回调函数,您可以在其中操作匹配数据
  • str_repeat("*", strlen($m[2]))只需构建一个*个字符串,其长度与第2组的长度相同。

注意

如果您必须使用preg_replace,则可以使用

preg_replace('~(?:\G(?!^)|[\w-]{2}(?=[\w-]*@))\K[^@]~', '*', $s)

请参阅regex demo

<强>详情

  • (?:\G(?!^)|[\w-]{2}) - 上一次成功匹配(\G(?!^))或(|)2个字或-字符([\w-]{2})的结尾跟着除了单词和-字符以及@之外的零个或多个字符(请参阅(?=[\w-]*@)
  • \K - 省略我们匹配的内容
  • [^@] - @以外的任何字符。

答案 1 :(得分:0)

example.gmail.com - 不是电子邮件。

您的正则表达式适用于example@gmail.com

等搜索字符串

如果您想使用example.gmail.com之类的字符串 - 您必须将表达式更改为:

preg_replace("/([_a-zA-Z0-9-]{2})([-a-z0-9]*)(.[_a-zA-Z0-9-]+)/i", "$1****$3", $model->email);

DEMO(切换到preg_replace标签)

[更新]问题已修改。第一个给出的示例字符串是example.gmail.com

答案 2 :(得分:0)

您的正则表达式与您在给定示例字符串中不可用的@符号相匹配。更改为.|@这将与.@

匹配
$email = "example.gmail.com";
$new_email  = preg_replace("/([_a-zA-Z0-9-]{2})([-a-z0-9]*)((.|@)[_a-zA-Z0-9-]+)/i", "$1****$3", $email);
echo $new_email;

DEMO