我是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
,我不知道如何显示用户名的最后一个,最后是电子邮件提供商。
答案 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 condition
和a character
正向后看。
(?<=@.)[a-zA-Z0-9]+(?=.\.)
表示匹配字符为one character
和.
正面向前看,而@
条件正向后看正字符.
<?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.com
或user@host.example.com
或joe@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";
}