Php 用星号(*)隐藏电子邮件地址

Php 用星号(*)隐藏电子邮件地址,php,string,Php,String,谁能帮我用简单的方法解决这个问题。。。 我有这个邮寄地址 abcedf@gmail.com 如何转换此邮件地址 a****f@gmail.com 我尝试使用strpos并获取@,但无法获取中间值并将其更改为***。任何人都可以帮你找到这个问题。希望这能帮你解决 正则表达式:^.\K[a-zA-Z\.0-9]+(?=。@)可以更改为此^[a-zA-Z]\K[a-zA-Z\.0-9]+(?=[a-zA-Z]@) 1.^.\K这将匹配电子邮件的第一个字符,\K将重置匹配 2.[a-zA-Z\.0-9]

谁能帮我用简单的方法解决这个问题。。。 我有这个邮寄地址
abcedf@gmail.com

如何转换此邮件地址
a****f@gmail.com


我尝试使用
strpos
并获取
@
,但无法获取中间值并将其更改为
***
。任何人都可以帮你找到这个问题。

希望这能帮你解决

正则表达式:
^.\K[a-zA-Z\.0-9]+(?=。@)
可以更改为此
^[a-zA-Z]\K[a-zA-Z\.0-9]+(?=[a-zA-Z]@)

1.
^.\K
这将匹配电子邮件的第一个字符,
\K
将重置匹配

2.
[a-zA-Z\.0-9]+(?=。@)
这将匹配字符串并对任何字符进行正向前瞻,然后
@

在代码的第二条语句中,我们创建的
*
数量与匹配的字符数量相同

在第三条语句中,我们使用
preg\u replace
删除带有
*
的匹配字符串


希望这能帮到你

正则表达式:
^.\K[a-zA-Z\.0-9]+(?=。@)
可以更改为此
^[a-zA-Z]\K[a-zA-Z\.0-9]+(?=[a-zA-Z]@)

1.
^.\K
这将匹配电子邮件的第一个字符,
\K
将重置匹配

2.
[a-zA-Z\.0-9]+(?=。@)
这将匹配字符串并对任何字符进行正向前瞻,然后
@

在代码的第二条语句中,我们创建的
*
数量与匹配的字符数量相同

在第三条语句中,我们使用
preg\u replace
删除带有
*
的匹配字符串


延迟回答,但您可以使用:

$email = "abcdef@gmail.com";
print preg_replace_callback('/(\w)(.*?)(\w)(@.*?)$/s', function ($matches){
    return $matches[1].preg_replace("/\w/", "*", $matches[2]).$matches[3].$matches[4];
}, $email);

# a****f@gmail.com

延迟回答,但您可以使用:

$email = "abcdef@gmail.com";
print preg_replace_callback('/(\w)(.*?)(\w)(@.*?)$/s', function ($matches){
    return $matches[1].preg_replace("/\w/", "*", $matches[2]).$matches[3].$matches[4];
}, $email);

# a****f@gmail.com

自从3年前第一次发布这个答案以来,我年纪更大,也更聪明了,所以我决定回顾一下我的片段。起初,我认为
@
上的
strpos()
可以获得地址“本地”部分的长度,我可以使用
substr\u replace()
简单地插入星号,但对于任何实际项目,多字节支持都是必要的。这意味着
mb_strops()
将是
strops()
的适当替代品,但php中还没有本机
mb_substr_replace()
函数,因此设计非正则代码片段的复杂过程变得越来越没有吸引力

如果你想看到我的原始答案,你可以查看编辑历史,但我不再支持它的使用。我的原始答案还详细说明了此页面上的其他答案如何无法混淆本地子字符串中包含1或2个字符的电子邮件地址。如果您正在考虑使用任何其他答案,但一定要根据
a@example.com
ab@example.com
作为初步单元测试

我要遵循的代码片段不验证电子邮件地址;假设您的项目将使用适当的方法来验证地址,然后再允许它进入您的系统。此代码段的强大/实用性在于它是多字节安全的,并且在所有情况下都会添加星号,并且当本地部分中只有一个字符时,会在
@
之前重复前导字符,因此更难猜出变异的地址。哦,要添加的星号数被声明为一个变量,以便于维护

代码:()()

输入/输出:

'a@example.com'              => 'a****a@example.com',
'ab@example.com'             => 'a****b@example.com',
'abc@example.com'            => 'a****c@example.com',
'abcd@example.com'           => 'a****d@example.com',
'abcde@example.com'          => 'a****e@example.com',
'abcdef@example.com'         => 'a****f@example.com',
'abcdefg@example.com'        => 'a*****g@example.com',
'Ф@example.com'              => 'Ф****Ф@example.com',
'ФѰ@example.com'             => 'Ф****Ѱ@example.com',
'ФѰД@example.com'            => 'Ф****Д@example.com',
'ФѰДӐӘӔӺ@example.com'        => 'Ф*****Ӻ@example.com',
'"a@tricky@one"@example.com' => '"************"@example.com',
正则表达式平面化:

/            #pattern delimiter
^            #start of string
(.)          #capture group #1 containing the first character
(.*?)        #capture group #2 containing zero or more characters (lazy, aka non-greedy)
([^@]?)      #capture group #3 containing an optional single non-@ character
(?=@[^@]+$)  #require that the next character is @ then one or more @ until the end of the string
/            #pattern delimiter
u            #unicode/multibyte pattern modifier
回拨说明:

/            #pattern delimiter
^            #start of string
(.)          #capture group #1 containing the first character
(.*?)        #capture group #2 containing zero or more characters (lazy, aka non-greedy)
([^@]?)      #capture group #3 containing an optional single non-@ character
(?=@[^@]+$)  #require that the next character is @ then one or more @ until the end of the string
/            #pattern delimiter
u            #unicode/multibyte pattern modifier
  • $m[1]

    第一个字符(捕获组#1)
  • stru repeat(“*”,max($minFill,mb_strlen($m[2],'UTF-8'))

    使用
    UTF-8
    编码测量捕获组#2的多字节长度,然后使用计算长度和声明的
    $minFill
    之间的较高值,然后重复字符
    *
    max()返回的次数
    打电话
  • ($m[3]?:$m[1])

    @
    之前的最后一个字符(捕获组#3);如果
    $m
    数组中的元素为空,则使用第一个元素的值——它将始终被填充

自从3年前第一次发布这个答案以来,我变得更老、更聪明了,所以我决定回顾一下我的片段。起初,我认为
@
上的
strpos()
可以获得地址“本地”部分的长度,我可以使用
substr\u replace()
简单地插入星号,但对于任何实际项目,多字节支持都是必要的。这意味着
mb_strops()
将是
strops()
的适当替代品,但php中还没有本机
mb_substr_replace()
函数,因此设计非正则代码片段的复杂过程变得越来越没有吸引力

如果你想看到我的原始答案,你可以查看编辑历史,但我不再支持它的使用。我的原始答案还详细说明了此页面上的其他答案如何无法混淆本地子字符串中包含1或2个字符的电子邮件地址。如果您正在考虑使用任何其他答案,但一定要根据
a@example.com
ab@example.com
作为初步单元测试

我要遵循的代码片段不验证电子邮件地址;假设您的项目将使用适当的方法来验证地址,然后再允许它进入您的系统。此代码段的强大/实用性在于它是多字节安全的,并且在所有情况下都会添加星号,并且当本地部分中只有一个字符时,会在
@
之前重复前导字符,因此更难猜出变异的地址。哦,要添加的星号数被声明为一个变量,以便于维护

代码:()()

输入/输出:

'a@example.com'              => 'a****a@example.com',
'ab@example.com'             => 'a****b@example.com',
'abc@example.com'            => 'a****c@example.com',
'abcd@example.com'           => 'a****d@example.com',
'abcde@example.com'          => 'a****e@example.com',
'abcdef@example.com'         => 'a****f@example.com',
'abcdefg@example.com'        => 'a*****g@example.com',
'Ф@example.com'              => 'Ф****Ф@example.com',
'ФѰ@example.com'             => 'Ф****Ѱ@example.com',
'ФѰД@example.com'            => 'Ф****Д@example.com',
'ФѰДӐӘӔӺ@example.com'        => 'Ф*****Ӻ@example.com',
'"a@tricky@one"@example.com' => '"************"@example.com',
正则表达式平面化:

/            #pattern delimiter
^            #start of string
(.)          #capture group #1 containing the first character
(.*?)        #capture group #2 containing zero or more characters (lazy, aka non-greedy)
([^@]?)      #capture group #3 containing an optional single non-@ character
(?=@[^@]+$)  #require that the next character is @ then one or more @ until the end of the string
/            #pattern delimiter
u            #unicode/multibyte pattern modifier
<?php
function hide_email($email) {
        // extract email text before @ symbol
        $em = explode("@", $email);
        $name = implode(array_slice($em, 0, count($em) - 1), '@');

        // count half characters length to hide
        $length = floor(strlen($name) / 2);

        // Replace half characters with * symbol
        return substr($name, 0, $length) . str_repeat('*', $length) . "@" . end($em);
}

echo hide_email("contactus@gmail.com");
?>