Любой Помогите мне решить это простым методом … У меня есть этот адрес электронной почты abcedf@gmail.com
.
Как конвертировать этот почтовый адрес a****f@gmail.com
Я попытался использовать strpos
и получить @
но я не могу получить средние значения и изменить его на ****
. Любой поможет найти эту проблему.
Есть несколько важных соображений, которые должны быть реализованы для этого вопроса, но сначала я предоставлю метод, а затем углубимся в некоторые потенциальные опасности с этой задачей …
(Обычно считается, что лучше использовать методы без регулярных выражений, если они не слишком запутаны для этого. Это будет использовать подход, не относящийся к регулярному выражению.)
Код: ( Демо )
// 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
Вышеуказанный метод не сбой при минимальной допустимой длине подстроки; предполагается, что все входные значения будут действительными электронными письмами.
Этот метод добавляет защиту для каждого письма, вставив минимум 4 звездочки в середине подстроки «почтовый ящик». Чтобы увеличить или уменьшить количество звездочек, просто измените $fill
. (Сохраняйте значение $fill
при минимальном значении 1
).
Все опубликованные на этой странице ответы на этой странице преуспевают, чтобы избежать множественных замещений, когда подстрока встречается более одного раза в электронной почте, например: abc@abc.abc
Я только хотел упомянуть об этом соображении, потому что неправильное использование означает, что адрес электронной почты будет получать искалеченных и, возможно, выявить подсказки относительно фактического адреса электронной почты пользователя.
К сожалению, два других ответа на этой странице не подходят для возможности подстроки коротких почтовых ящиков в их методах. Это приводит к тому, что полностью открываются адреса электронной почты и / или появляется сообщение NOTICE …
//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 возможно, что уязвимости метода других плакатов никогда не будут проблемой – возможно, потому, что список писем является списком электронной почты сотрудников компании, и компания имеет формат адреса электронной почты, который гарантирует, что все подстроки почтовых ящиков больше двух символов. Однако, отвечая на этот вопрос каноническим способом, вы получите большую ценность для всех пользователей, которые хотят реализовать подобный метод.
Надеюсь, это поможет вам.
Regex: ^.\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]+(?=.@)
Это будет соответствовать строке и положительному взгляду вперед для любого символа, затем@
Во втором выражении кода мы создаем то же самое. of *
's как нет. символов в матче.
В третьем утверждении мы используем preg_replace
для удаления сопоставленной строки с *
Попробуйте этот фрагмент кода здесь
<?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
Поздний ответ, но вы можете использовать:
$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