2017-08-24 25 views
1

我想更改电子邮件[email protected]ex*****@gmail.com得到的*相同数量一样多的中间替换一定数目的字符与*因为符号已被替换。在该行

我该如何改变这段代码?

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

IYou必须使用正则表达式或其他方法? – albert

+0

Лёня,如果任何答案有效,请考虑接受(答案左侧有一个灰色的勾号,供您点击)。 –

回答

3

使用preg_replace_callback

$s = "[email protected]"; 
$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 - 省略我们匹配的内容
  • [^@] - 除@以外的任何字符。
+0

我打算发布这个:D(y) – hassan

+1

@hassan但是,还有另外一个纯正则表达式的方法,请参阅我的更新:) –

+1

是的@bobblebubble,或许在这种情况下是合理的。它只会被检查一次。 –

0

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

你的正则表达式将正常工作与像[email protected]

如果你想与像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标签)

[UPDATE]问题已编辑。首先给出的例子字符串的example.gmail.com

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