我想更改电子邮件[email protected]到ex*****@gmail.com得到的*
相同数量一样多的中间替换一定数目的字符与*因为符号已被替换。在该行
我该如何改变这段代码?
preg_replace("/([_a-zA-Z0-9-]{2})([-a-z0-9]*)(@[_a-zA-Z0-9-]+)/i", "$1****$3", $model->email);
我想更改电子邮件[email protected]到ex*****@gmail.com得到的*
相同数量一样多的中间替换一定数目的字符与*因为符号已被替换。在该行
我该如何改变这段代码?
preg_replace("/([_a-zA-Z0-9-]{2})([-a-z0-9]*)(@[_a-zA-Z0-9-]+)/i", "$1****$3", $model->email);
使用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)
详细
(?:\G(?!^)|[\w-]{2})
- 要么被随后以比字其他零个或多个字符和-
字符和一个@
先前成功匹配(\G(?!^)
)或(|
)2字或-
字符([\w-]{2}
)的端部(参见(?=[\w-]*@)
)\K
- 省略我们匹配的内容[^@]
- 除@
以外的任何字符。我打算发布这个:D(y) – hassan
@hassan但是,还有另外一个纯正则表达式的方法,请参阅我的更新:) –
是的@bobblebubble,或许在这种情况下是合理的。它只会被检查一次。 –
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
您的正则表达式匹配@
符号,它在给定的示例字符串中不可用。与.|@
改变它,这个将匹配.
或@
$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;
IYou必须使用正则表达式或其他方法? – albert
Лёня,如果任何答案有效,请考虑接受(答案左侧有一个灰色的勾号,供您点击)。 –