В некоторых случаях бывает полезно скрыть имя человека, оставив первую и последнюю буквы имени и фамилии. Так, например, Николай Миронов превратится в Н•••••й М•••••в.

<?php //Прячем имя человека за звездочками // $person_name - строка в которой хотим заменить часть букв на звездочки // $first - количество символов, открытых в начале слова // $last - количество символов, открытых в конце слова // $symbol - указываем символ, которым будем скрывать буквы function hide_person_name($person_name, $first=1, $last=1, $symbol='*') { //Получаем количество символов в имени //Используем mb_strlen вместо strlen для поддержки кириллицы/UTF-8 $letters_count = mb_strlen($person_name); //Разбиваем ФИО на отдельные слова $name_array = explode(" ", $person_name); //Определяем переменную в которую сохраним результат $hidden_name = ''; //В цикле заменяем символы на звездочки, оставляя только первую и последнюю буквы foreach ($name_array as $name) { $part_length = mb_strlen($name); //Если количество символов, которые надо скрыть больше //чем длинна слова — заменяем слово на символы if ( ($first + $last) >= $part_length ) { $i = 1; while($i <= $part_length) { $hidden_name .= $symbol; $i++; } //Добавляем пробел после каждой части $hidden_name .= ' '; } //А если слово больше — идем по стандартному алгоритму else { $first_letters = mb_substr($name,0,$first,"UTF-8"); $last_letters = mb_substr($name,-1*$last,$last,"UTF-8"); $i = 1; while ( $i < ($part_length-$last) ) { $first_letters .= $symbol; $i++; } //Добавляем пробел после каждой части $hidden_name .= $first_letters . $last_letters . ' '; } } //Удаляем лишний пробел в конце $hidden_name = rtrim($hidden_name); return $hidden_name; }
Альтернативное решение, использующее регулярные выражения, предложено Владимиром Дружаевым (otshelnik-fm.ru/):
function hide_person_name( $person_name ) { $name_array = explode( " ", $person_name ); $out = ''; foreach ( $name_array as $name ) { if ( mb_strlen( $name ) === 2 ) { $out .= mb_substr( $name, 0, 1, "UTF-8" ) . '* '; } else { $out .= preg_replace( '/(?<!^).(?!$)/iu', '*', $name ) . ' '; } } return $out ."\r\n"; }
Николай – я уверен что можно было на регулярках сделать, да и компактней. Вот что вышло: http://sandbox.onlinephpfunctions.com/code/862954c2aab2aa24f502d93c5d10ca468de4632f – в песочнице жми Execute Code
Всё по т.з: “скрыть имя человека, оставив первую и последнюю буквы имени и фамилии. ” – поэтому 2-4 аргументы упустил. Да и кейс с ними редкий.
А еще Че геварру или Чи Лин можно не спалить
Спасибо, Владимир. Как всегда ваше решение более элегантно. Добавлю в заметку