Частично скрывать адрес электронной почты в PHP

Я создаю простую систему друзей / друзей, и когда кто-то пытается найти новых друзей, я хочу показать частично скрытые адреса электронной почты, чтобы дать представление о том, кем может быть пользователь, не раскрывая фактических данных.

Поэтому я хочу, чтобы abcdlkjlkjk@hotmail.com стал abcdl******@hotmail.com .

В качестве теста я написал:

 <?php $email = "abcdlkjlkjk@hotmail.com"; $em = explode("@",$email); $name = $em[0]; $len = strlen($name); $showLen = floor($len/2); $str_arr = str_split($name); for($ii=$showLen;$ii<$len;$ii++){ $str_arr[$ii] = '*'; } $em[0] = implode('',$str_arr); $new_name = implode('@',$em); echo $new_name; 

Это работает, но мне было интересно, есть ли более простой / более короткий способ применения той же логики? Может быть, как регулярное выражение?

Related of "Частично скрывать адрес электронной почты в PHP"

вот что-то быстрое:

 function obfuscate_email($email) { $em = explode("@",$email); $name = implode(array_slice($em, 0, count($em)-1), '@'); $len = floor(strlen($name)/2); return substr($name,0, $len) . str_repeat('*', $len) . "@" . end($em); } // to see in action: $emails = ['"Abc\@def"@iana.org', 'abcdlkjlkjk@hotmail.com']; foreach ($emails as $email) { echo obfuscate_email($email) . "\n"; } 

эхо:

 "Abc\*****@iana.org abcdl*****@hotmail.com 

использует substr() и str_repeat()

Вот мое альтернативное решение для этого.

Я бы не использовал точное количество символов маски в соответствии с первоначальной длиной письма, а скорее использовал маску с фиксированной длиной для соображений неприкосновенности частной жизни. Я бы также установил максимально допустимые символы, чтобы показывать, а также не показывать больше половины сообщения. Я бы также замаскировал все электронные письма меньше минимальной длины.

С учетом этих правил, вот моя функция с дополнительными параметрами:

 function maskEmail($email, $minLength = 3, $maxLength = 10, $mask = "***") { $atPos = strrpos($email, "@"); $name = substr($email, 0, $atPos); $len = strlen($name); $domain = substr($email, $atPos); if (($len / 2) < $maxLength) $maxLength = ($len / 2); $shortenedEmail = (($len > $minLength) ? substr($name, 0, $maxLength) : ""); return "{$shortenedEmail}{$mask}{$domain}"; } 

тесты:

 $email = ""; $tests = []; for ($i=0; $i < 22; $i++) { $email .= chr(97 + $i); $tests[] = $email . " -> " . maskEmail("{$email}@example.com"); } print_r($tests); 

Результаты:

 Array ( [0] => a -> ***@example.com [1] => ab -> ***@example.com [2] => abc -> ***@example.com [3] => abcd -> ab***@example.com [4] => abcde -> ab***@example.com [5] => abcdef -> abc***@example.com [6] => abcdefg -> abc***@example.com [7] => abcdefgh -> abcd***@example.com [8] => abcdefghi -> abcd***@example.com [9] => abcdefghij -> abcde***@example.com [10] => abcdefghijk -> abcde***@example.com [11] => abcdefghijkl -> abcdef***@example.com [12] => abcdefghijklm -> abcdef***@example.com [13] => abcdefghijklmn -> abcdefg***@example.com [14] => abcdefghijklmno -> abcdefg***@example.com [15] => abcdefghijklmnop -> abcdefgh***@example.com [16] => abcdefghijklmnopq -> abcdefgh***@example.com [17] => abcdefghijklmnopqr -> abcdefghi***@example.com [18] => abcdefghijklmnopqrs -> abcdefghi***@example.com [19] => abcdefghijklmnopqrst -> abcdefghij***@example.com [20] => abcdefghijklmnopqrstu -> abcdefghij***@example.com [21] => abcdefghijklmnopqrstuv -> abcdefghij***@example.com ) 

Я использую это:

  function secret_mail($email) { $prop=2; $domain = substr(strrchr($email, "@"), 1); $mailname=str_replace($domain,'',$email); $name_l=strlen($mailname); $domain_l=strlen($domain); for($i=0;$i<=$name_l/$prop-1;$i++) { $start.='x'; } for($i=0;$i<=$domain_l/$prop-1;$i++) { $end.='x'; } return substr_replace($mailname, $start, 2, $name_l/$prop).substr_replace($domain, $end, 2, $domain_l/$prop); } 

Выведет что-то вроде: cyxxxxxone @ gmxxxxcom

Например :

 substr($email, 0, 3).'****'.substr($email, strpos($email, "@")); 

Что даст вам что-то вроде:

abc****@hotmail.com

Я создал функцию, которая может помочь кому-то

  function hideEmail($email) { $mail_parts = explode("@", $email); $length = strlen($mail_parts[0]); $show = floor($length/2); $hide = $length - $show; $replace = str_repeat("*", $hide); return substr_replace ( $mail_parts[0] , $replace , $show, $hide ) . "@" . substr_replace($mail_parts[1], "**", 0, 2); } hideEmail("name@example.com"); // output: na**@**ample.com hideEmail("something@example.com"); // output: some*****@**ample.com 

Вы можете настроить, как хотите .. что-то вроде этого (если длина 4 или менее, отображает только первый)

  function hideEmail($email) { $mail_parts = explode("@", $email); $length = strlen($mail_parts[0]); if($length <= 4 & $length > 1) { $show = 1; }else{ $show = floor($length/2); } $hide = $length - $show; $replace = str_repeat("*", $hide); return substr_replace ( $mail_parts[0] , $replace , $show, $hide ) . "@" . substr_replace($mail_parts[1], "**", 0, 2); } hideEmail("name@example.com"); // output: n***@**ample.com hideEmail("something@example.com"); // output: some*****@**ample.com 

Иногда хорошо показывать и последнего персонажа .

ABCDEFZ@gmail.com становится A*****Z@gmail.com

Я предлагаю вам все упростить. Возможно, что-то вроде этого достаточно просто https://github.com/fedmich/PHP_Codes/blob/master/mask_email.php

Маскирует электронное письмо, чтобы отображать первые 3 символа, а затем последний символ перед знаком @

 function mask_email( $email ) { /* Author: Fed Simple way of masking emails */ $char_shown = 3; $mail_parts = explode("@", $email); $username = $mail_parts[0]; $len = strlen( $username ); if( $len <= $char_shown ){ return implode("@", $mail_parts ); } //Logic: show asterisk in middle, but also show the last character before @ $mail_parts[0] = substr( $username, 0 , $char_shown ) . str_repeat("*", $len - $char_shown - 1 ) . substr( $username, $len - $char_shown + 2 , 1 ) ; return implode("@", $mail_parts ); } 

Попробуйте эту функцию. Это будет работать с действительными электронными сообщениями, такими как "Abc\@def"@iana.org .

 function hideEmail($email){ $prefix = substr($email, 0, strrpos($email, '@')); $suffix = substr($email, strripos($email, '@')); $len = floor(strlen($prefix)/2); return substr($prefix, 0, $len) . str_repeat('*', $len) . $suffix; } echo hideEmail('abcdljtrsjtrsjlkjk@hotmail.com'); echo hideEmail('"abc\@def"@iana.org'); 

Возвращает

 abcdljtrs*********@hotmail.com "abc\*****@iana.org 

У меня есть функция

 function hide_email($email){ $final_str = ''; $string = explode('@', $email); $leftlength = strlen($string[0]); $string2 = explode('.', $string[1]); $string2len = strlen($string2[0]); $leftlength_new = $leftlength-1; $first_letter = substr($string[0], 0,1); $stars = ''; $stars2 = ''; for ($i=0; $i < $leftlength_new; $i++) { $stars .= '*'; } for ($i=0; $i < $string2len; $i++) { $stars2 .= '*'; } $stars; return $final_str .= $first_letter.$stars.'@'.$stars2.'.'.$string2[1]; 

}

echo hide_email ('Hello@PHP.com ');

Возникла проблема в случае, если перед символом будет 1 символ. Я исправил функцию ниже.

 function obfuscate_email($email) { $em = explode("@",$email); if(strlen($em[0])==1){ return '*'.'@'.$em[1]; } $name = implode(array_slice($em, 0, count($em)-1), '@'); $len = floor(strlen($name)/2); return substr($name,0, $len) . str_repeat('*', $len) . "@" . end($em); } 

Возможно, это не то, что вы хотите, но я бы пошел на это:

 <?php /* Here's the logic: We want to show X numbers. If length of STR is less than X, hide all. Else replace the rest with *. */ function mask($str, $first, $last) { $len = strlen($str); $toShow = $first + $last; return substr($str, 0, $len <= $toShow ? 0 : $first).str_repeat("*", $len - ($len <= $toShow ? 0 : $toShow)).substr($str, $len - $last, $len <= $toShow ? 0 : $last); } function mask_email($email) { $mail_parts = explode("@", $email); $domain_parts = explode('.', $mail_parts[1]); $mail_parts[0] = mask($mail_parts[0], 2, 1); // show first 2 letters and last 1 letter $domain_parts[0] = mask($domain_parts[0], 2, 1); // same here $mail_parts[1] = implode('.', $domain_parts); return implode("@", $mail_parts); } $emails = array( 'a@a.com', 'ab@aa.com', 'abc@aaa.com', 'abcd@aaaa.com', 'abcde@aaaaa.com', 'abcdef@aaaaaa.com', 'abcdefg@aaaaaaa.com', 'abcdefgh@aaaaaaaa.com', 'abcdefghi@aaaaaaaaa.com' ); foreach ($emails as $email){ echo '<b>'.$email.'</b><br>'.mask_email($email).'<br><hr>'; } 

Результат:

 a@a.com *@*.com ab@aa.com **@**.com abc@aaa.com ***@***.com abcd@aaaa.com ab*d@aa*a.com abcde@aaaaa.com ab**e@aa**a.com abcdef@aaaaaa.com ab***f@aa***a.com abcdefg@aaaaaaa.com ab****g@aa****a.com abcdefgh@aaaaaaaa.com ab*****h@aa*****a.com abcdefghi@aaaaaaaaa.com ab******i@aa******a.com 

Хотя это старая нить и уже много ответов. Я хочу поделиться своим собственным фрагментом.

Которая проверяет, является ли это действительным электронным письмом или нет. Сколько персонажей нужно подвергать цензуре и показывать. Какой знак следует использовать для цензуры.

 function get_censored_email($email, $show_chars = 3, $censor_char = '*') { if (filter_var($email, FILTER_VALIDATE_EMAIL)) { $char_length = strlen($email); $censor_count = $char_length - $show_chars; $return_email = substr($email, 0, $show_chars); $return_email .= str_repeat("*", $censor_count); return $return_email; } 

}

 $email = 'noman.ibrahim115@gmail.com'; echo get_censored_email($email, 3, '*'); // returns nom***********************