Скрываем слова за звездочками. Универсальная функция

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

<?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";
}

2 Replies

  • Николай – я уверен что можно было на регулярках сделать, да и компактней. Вот что вышло: http://sandbox.onlinephpfunctions.com/code/862954c2aab2aa24f502d93c5d10ca468de4632f – в песочнице жми Execute Code
    Всё по т.з: “скрыть имя человека, оставив первую и последнюю буквы имени и фамилии. ” – поэтому 2-4 аргументы упустил. Да и кейс с ними редкий.
    А еще Че геварру или Чи Лин можно не спалить

    • Спасибо, Владимир. Как всегда ваше решение более элегантно. Добавлю в заметку

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *