В некоторых случаях бывает полезно скрыть имя человека, оставив первую и последнюю буквы имени и фамилии. Так, например, Николай Миронов превратится в Н•••••й М•••••в.
<?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 аргументы упустил. Да и кейс с ними редкий.
А еще Че геварру или Чи Лин можно не спалить
Спасибо, Владимир. Как всегда ваше решение более элегантно. Добавлю в заметку