我想做一个php正则表达式来屏蔽电子邮件,以便
example@gmail.com
转到e*****e@gmail.com
。
$maskedEmail=preg_replace('/^*@/', '*', $email);
答案 0 :(得分:3)
您可以使用
preg_replace('~((?!^)\G|^[^@])[^@](?=[^@]+@)~', '$1*', $s)
请参见regex demo
详细信息
((?!^)\G|^[^@])
-第1组:上一个匹配项的末尾或字符串的开始以及除@
之外的其他任何字符[^@]
-除@
之外的一个字符(?=[^@]+@)
-一个积极的前瞻,需要1个以上的字符(+
在这里很重要,您不能使用*
),除@
之后是{ {1}}立即位于当前位置的右侧。替换是在组1中捕获的值(因此第一个字符保留在字符串中,然后将@
之前的除最后一个字符以外的所有字符都替换为@
。
答案 1 :(得分:0)
为了不掩盖第一个字符,您可以断言直接在左边的不是字符串的开头。
要不直接在@之前屏蔽字符,可以断言在匹配之前,右边总是一个不是@的字符。
(?<!^).(?=[^@]+@)
在替换使用中:
*
说明
(?<!^)
,在向后寻找负数时,断言直接在左侧的不是字符串的开头.
匹配换行符以外的任何字符(?=
正向前进,断言右边直接是
[^@]+@
使用negated character class匹配除@
之外的任意字符1倍以上,并匹配@
)
积极回望例如
$email = "example@gmail.com";
$maskedEmail=preg_replace('/(?<!^).(?=[^@]+@)/', '*', $email);
echo $maskedEmail;
结果
e ***** e@gmail.com