我希望将 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);
答案 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;