隐藏带星星的电子邮件地址(*)

时间:2017-05-03 14:00:27

标签: php string

任何人帮我用简单的方法解决这个问题... 我有这个邮件地址 abcedf@gmail.com

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

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

5 个答案:

答案 0 :(得分:1)

希望这会帮助你。

正则表达式: ^.\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]+(?=.@)这将匹配任何字符的字符串和正向预测@

在第二个代码声明中,我们创建相同的no。 *作为号码。匹配中的字符。

在第三个声明中,我们使用preg_replace删除与*匹配的字符串

Try this code snippet here

<?php
$string='abcedf@gmail.com';
preg_match('/^.\K[a-zA-Z\.0-9]+(?=.@)/',$string,$matches);//here we are gathering this part bced

$replacement= implode("",array_fill(0,strlen($matches[0]),"*"));//creating no. of *'s
echo preg_replace('/^(.)'.preg_quote($matches[0])."/", '$1'.$replacement, $string);

<强>输出: a****f@gmail.com

答案 1 :(得分:1)

迟到的答案,但您可以使用:

df.insert(4,'Report Category',' ')

答案 2 :(得分:1)

这个问题应该有一些重要的考虑因素,但我先提供一种方法,然后通过这项任务深入研究一些潜在的危害...

(通常认为最好的做法是使用非正则表达式方法,因为它不会太复杂。这将采用非正则表达式方法。)

代码:(Demo

// only processing valid emails, so at least one character before @
$emails=['a@gmail.com', // output: a****a@gmail.com
         'ab@gmail.com', // output: a****b@gmail.com
         'abc@gmail.com', // output: a****c@gmail.com
         'abcd@gmail.com', // output: a****d@gmail.com
         'abcde@gmail.com', // output: a****e@gmail.com
         'abcdef@gmail.com', // output: a****f@gmail.com
         'abcdefg@gmail.com'  // output: a*****g@gmail.com  <- 5-asterisk fill
        ];
$fill=4;  // minimum number of asterisks to inject
foreach($emails as $email){
    $user=strstr($email,'@',true);  // extract entire substring before @
    $len=strlen($user);  // measure length of username string
    if($len>$fill+2){$fill=$len-2;} // increase fill amount for more asterisks in str_repeat
    $starred=substr($user,0,1).str_repeat("*",$fill).substr($user,-1).strstr($email,'@');
    // 1st char-----------^^^ fill--------^^^^^^^^^ last char-----^^  ^^^^^^^^^^^^^^^^^-the rest of the original email string
    echo "$starred\n";
}

输出:

a****a@gmail.com
a****b@gmail.com
a****c@gmail.com
a****d@gmail.com
a****e@gmail.com
a****f@gmail.com
a*****g@gmail.com

上述方法在最小有效子字符串长度上不会失败;假设所有输入值都是有效的电子邮件。

该方法通过在&#34;邮箱&#34;中间插入至少4个星号,为每封电子邮件添加身份保护。子。要增加或减少星号数,只需修改$fill即可。 (保持$fill值的最小值为1。)

当在电子邮件中多次出现子字符串时,此页面上当前发布的所有答案都可以避免多次替换:abc@abc.abc我只想提及这一考虑,因为错误将意味着电子邮件地址会被破坏,可能会显示有关用户实际电子邮件地址的线索。

不幸的是,此页面上的其他两个答案无法适应其方法中短邮箱子串的可能性。这导致电子邮件地址完全暴露和/或出现通知......

//Pedro Lobito:
// $email="a@gmail.com"; output: a@gmail.com      <-- not okay
// $email="ab@gmail.com"; output: ab@gmail.com    <-- not okay
// $email="abc@gmail.com"; output: a*c@gmail.com  <-- okay

//Sahil Gulati:
// $string="a@gmail.com"; output: NOTICE x2 and a@gmail.com    <-- not okay
// $string="ab@gmail.com"; output: NOTICE x2 and ab@gmail.com  <-- not okay
// $string="abc@gmail.com"; output: a*c@gmail.com              <-- okay

对于OP的用例,可能是其他海报&#39;方法漏洞永远不会成为问题 - 可能是因为电子邮件列表是公司的员工电子邮件列表,公司的电子邮件地址格式确保所有邮箱子字符串都大于两个字符。但是,以规范的方式回答这个问题将为希望实施类似方法的所有用户带来更大的价值。

答案 3 :(得分:0)

这是简单的版本:

$em = 'abcde@gmail.com'; // 'a****e@gmail.com'
$em = 'abcdefghi@gmail.com'; // 'a*******i@gmail.com'

使用PHP String函数

$stars = 4; // Min Stars to use
$at = strpos($em,'@');
if($at - 2 > $stars) $stars = $at - 2;
print substr($em,0,1) . str_repeat('*',$stars) . substr($em,$at - 1);

答案 4 :(得分:0)

在某些情况下,您希望显示部分电子邮件,以向用户提供有关其电子邮件ID的提示。如果要查找类似的内容,则可以使用电子邮件用户名的一半字符,并替换为某些字符。这是 PHP函数,可用于您的项目hide email address

<?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");
?>

//输出:cont **** @ gmail.com