用于显示用户和域的第一个和最后一个字母的电子邮件的正则表达式

时间:2017-04-25 17:59:01

标签: php regex

我是regex的新手,我试图在php中用星号代替一些字符,如下所示:

电子邮件:Blob URL Store - > victor@gmail.com

我做到了:

v****r@g***l.com

问题是输出为$email = preg_replace('/(?:^|@).\K|\.[^@]*$(*SKIP)(*F)|.(?=.*?\.)/', '*', $linha['cli_email']); 而不是v*****@g****.com,我不知道如何显示用户名的最后一个,最后是电子邮件提供商。

3 个答案:

答案 0 :(得分:2)

你可以试试这个:

 $email = preg_replace('/(?:^|.@).\K|.\.[^@]*$(*SKIP)(*F)|.(?=.*?\.)/', '*', $linha['cli_email']);

希望它有所帮助......

答案 1 :(得分:2)

首先,我们使用正则表达式匹配字符串。

正则表达式: (?<=\b[a-z])[a-zA-Z0-9]+(?=.\@)|(?<=@.)[a-zA-Z0-9]+(?=.\.)

  

(?<=\b[a-z])[a-zA-Z0-9]+(?=.\@)表示匹配字符为one character@正面向前,而boundary conditiona character正向后看。

     

(?<=@.)[a-zA-Z0-9]+(?=.\.)表示匹配字符为one character.正面向前看,而@条件正向后看正字符.

Try this code snippet here

<?php

ini_set('display_errors', 1);
$email="victor@gmail.com";
preg_match_all('/(?<=\b[a-z])[a-z]+(?=.\@)|(?<=@.)[a-z]+(?=.\.)/',$email,$matches);
foreach($matches[0] as $key => $value)
{
    $email=str_replace($value, getStars(strlen($value)), $email);
}
echo $email;
function getStars($length)
{
    $string="";
    for($x=0;$x<$length;$x++)
    {
        $string.="*";
    }
    return $string;
}

答案 2 :(得分:0)

您需要考虑所有类型的电子邮件地址。接受的答案如何处理m@example.comuser@host.example.comjoe@m.com等电子邮件地址?

<?php
function starmid($str) {
    switch (strlen($str)) {
        case 0: return false;
        case 1: return $str;
        case 2: return $str[0] . "*";
        default: return $str[0] . str_repeat("*", strlen($str) - 2) . substr($str, -1);
    }
}
function hideemail($email) {
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        return false;
    }
    list($u, $d) = explode("@", $email);
    $d = explode(".", $d);
    $tld = array_pop($d);
    $d = implode(".", $d);
    return starmid($u) . "@" . starmid($d) . ".$tld";
}

$emails = [
    "victor@gmail.com",
    "v@example.com",
    "victor@g.com",
    "victor@host.example.com",
    "victor+foo@gmail.com",
    "invalid@",
];

foreach ($emails as $email) {
    echo hideemail($email) . "\n";
}