[Д] [StringExtension::Replace] Функция заменяет все вхождения строки поиска на строку замены в заданной строке (аналог mb_str_replace). [Д] [StringExtension::ReplaceAll] Функция заменяет все вхождения строк поиск на соответствующие строки замены в заданной строке.
		
			
				
	
	
		
			269 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			269 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | ||
| 
 | ||
| namespace goodboyalex\php_components_pack\extensions;
 | ||
| 
 | ||
| /**
 | ||
|  * Расширение строк.
 | ||
|  *
 | ||
|  * @author Александр Бабаев
 | ||
|  * @package php_components_pack
 | ||
|  * @version 1.0
 | ||
|  * @since 1.0
 | ||
|  */
 | ||
| final class StringExtension
 | ||
| {
 | ||
|     /**
 | ||
|      * @var array|string[] $RussianLetters Набор русских букв
 | ||
|      */
 | ||
|     private static array $RussianLetters =
 | ||
|         [
 | ||
|             'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й',
 | ||
|             'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф',
 | ||
|             'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я',
 | ||
|             'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й',
 | ||
|             'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф',
 | ||
|             'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я'
 | ||
|         ];
 | ||
| 
 | ||
|     /**
 | ||
|      * @var array|string[] $RussianLettersTransliteration Набор русских букв в транслитерации
 | ||
|      */
 | ||
|     private static array $RussianLettersTransliteration =
 | ||
|         [
 | ||
|             "a", "b", "v", "g", "d", "e", "yo", "zh", "z", "i", "j",
 | ||
|             "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f",
 | ||
|             "h", "c", "ch", "sh", "sch", "j", "i", "j", "e", "yu", "ya",
 | ||
|             "A", "B", "V", "G", "D", "E", "Yo", "Zh", "Z", "I", "J",
 | ||
|             "K", "L", "M", "N", "O", "P", "R", "S", "T", "U", "F",
 | ||
|             "H", "C", "Ch", "Sh", "Sch", "J", "I", "J", "E", "Yu", "Ya"
 | ||
|         ];
 | ||
| 
 | ||
|     /**
 | ||
|      * Сравнивает две строки.
 | ||
|      *
 | ||
|      * @param string|null $str1 Первая строка.
 | ||
|      * @param string|null $str2 Вторая строка.
 | ||
|      * @param bool $ignoreCase Игнорировать регистр.
 | ||
|      *
 | ||
|      * @return int Результат сравнения. Возвращаемые значения:
 | ||
|      *
 | ||
|      *      -1 | значение $str1 меньше значения $str2.
 | ||
|      *       0 | значения $str1 и $str2 равны.
 | ||
|      *       1 | значение $str1 больше значения $str2.
 | ||
|      */
 | ||
|     public static function Compare (string|null $str1, string|null $str2, bool $ignoreCase = false): int
 | ||
|     {
 | ||
|         // Если оба пусты
 | ||
|         if (self::IsNullOrWhitespace($str1) && self::IsNullOrWhitespace($str2))
 | ||
|             // - то равны
 | ||
|             return 0;
 | ||
| 
 | ||
|         // Если первый из них не пуст, а второй пуст
 | ||
|         if (!self::IsNullOrWhitespace($str1) && self::IsNullOrWhitespace($str2))
 | ||
|             // - то первый больше
 | ||
|             return 1;
 | ||
| 
 | ||
|         // Если первый из них пуст, а второй не пуст
 | ||
|         if (!self::IsNullOrWhitespace($str1) && self::IsNullOrWhitespace($str2))
 | ||
|             // - то первый меньше
 | ||
|             return -1;
 | ||
| 
 | ||
|         // Если нужно игнорировать регистр
 | ||
|         if ($ignoreCase)
 | ||
|             // - то сравниваем по "человечески" без учёта регистра
 | ||
|             return strnatcasecmp($str1, $str2);
 | ||
| 
 | ||
|         // Иначе сравниваем по "человечески" с учётом регистра
 | ||
|         return strnatcmp($str1, $str2);
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * Проверяет, пуста ли строка, содержит ли вместо текста только пробелы.
 | ||
|      *
 | ||
|      * @param string|null $str Проверяемая строка.
 | ||
|      *
 | ||
|      * @return bool Результат проверки.
 | ||
|      */
 | ||
|     public static function IsNullOrWhitespace (string|null $str): bool
 | ||
|     {
 | ||
|         return self::IsNullOrEmpty($str) || trim($str) === '';
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * Проверяет, пуста ли строка.
 | ||
|      *
 | ||
|      * @param string|null $str Проверяемая строка.
 | ||
|      *
 | ||
|      * @return bool Результат проверки.
 | ||
|      */
 | ||
|     public static function IsNullOrEmpty (string|null $str): bool
 | ||
|     {
 | ||
|         return is_null($str) || $str === '';
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * Конвертация в латиницу.
 | ||
|      *
 | ||
|      * @param string $source Исходное слово или выражение
 | ||
|      *
 | ||
|      * @return string Транслитерированное слово или выражение
 | ||
|      */
 | ||
|     public static function ConvertToLatin (string $source): string
 | ||
|     {
 | ||
|         // Создаю результат
 | ||
|         $result = "";
 | ||
| 
 | ||
|         // Длина исходного слова
 | ||
|         $length = mb_strlen($source);
 | ||
| 
 | ||
|         // Для каждой буквы или символа из слова
 | ||
|         for ($i = 0; $i < $length; $i++) {
 | ||
|             // - получаю букву или символ
 | ||
|             $letter = mb_substr($source, $i, 1);
 | ||
| 
 | ||
|             // - если это буква из русского алфавита
 | ||
|             if (self::IsRussianLetter($letter)) {
 | ||
|                 // -- транслитерирую эту букву
 | ||
|                 $resultTransliteration = self::TransliterationFromRussian($letter);
 | ||
| 
 | ||
|                 // -- если транслитерация не удалась
 | ||
|                 if ($resultTransliteration === false)
 | ||
|                     // --- вывожу оригинальную букву
 | ||
|                     $result = $result . $letter;
 | ||
|                 else
 | ||
|                     // --- вывожу транслитерированную букву
 | ||
|                     $result = $result . $resultTransliteration;
 | ||
| 
 | ||
|                 // -- и иду к следующей букве или символу
 | ||
|                 continue;
 | ||
|             }
 | ||
| 
 | ||
|             // - если до сих пор буква или символ не обработаны, то возвращаю их
 | ||
|             $result = $result . $letter;
 | ||
|         }
 | ||
| 
 | ||
|         // Вывожу результат
 | ||
|         return $result;
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * Проверяет, является ли буква русской.
 | ||
|      *
 | ||
|      * @param string $letter Буква
 | ||
|      *
 | ||
|      * @return bool Является ли буква русской
 | ||
|      */
 | ||
|     private static function IsRussianLetter (string $letter): bool
 | ||
|     {
 | ||
|         return in_array($letter, self::$RussianLetters);
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * Получаю транслитерированную букву русского алфавита.
 | ||
|      *
 | ||
|      * @param string $letter Буква
 | ||
|      *
 | ||
|      * @return false|string Транслитерированная буква или false, если массивы не совпадают или буква не содержится
 | ||
|      * в массивах.
 | ||
|      */
 | ||
|     private static function TransliterationFromRussian (string $letter): false|string
 | ||
|     {
 | ||
|         // Если размерность массивов разная
 | ||
|         if (count(self::$RussianLetters) !== count(self::$RussianLettersTransliteration))
 | ||
|             // - то вывожу ошибку
 | ||
|             return false;
 | ||
| 
 | ||
|         // Получаю индекс буквы
 | ||
|         $ind = array_search($letter, self::$RussianLetters, true);
 | ||
| 
 | ||
|         // Если буква не найдена
 | ||
|         if ($ind === false)
 | ||
|             // - то вывожу ошибку
 | ||
|             return false;
 | ||
| 
 | ||
|         // Получаю транслитерированную букву
 | ||
|         return self::$RussianLettersTransliteration[$ind];
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * Обрезает строку до указанных в параметре $maxLength символов
 | ||
|      *
 | ||
|      * @param string $text Исходный текст
 | ||
|      * @param int $maxLength Максимальная длина текста
 | ||
|      * @param string $endDots Суффикс, которым завершается обрезанная строка
 | ||
|      *
 | ||
|      * @return string Обрезанный текст
 | ||
|      */
 | ||
|     public static function GetShortText (string $text, int $maxLength, string $endDots = ''): string
 | ||
|     {
 | ||
|         // Если длина текста меньше максимальной
 | ||
|         if (mb_strlen($text) <= $maxLength)
 | ||
|             // - то возвращаю исходный текст
 | ||
|             return $text;
 | ||
| 
 | ||
|         // Если длина текста больше максимальной, то получаю длину текста без суффикса
 | ||
|         $lengthWithoutEndDots = $maxLength - mb_strlen($endDots);
 | ||
| 
 | ||
|         // Возвращаю обрезанный текст
 | ||
|         return mb_substr($text, 0, $lengthWithoutEndDots) . $endDots;
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * Функция заменяет все вхождения строк поиск на соответствующие строки замены в заданной строке.
 | ||
|      *
 | ||
|      * @param array $searchReplace Массив с парами поиска и замены. Например, <code>['-' => '#', '$' => '%']</code>
 | ||
|      *     заменит все дефисы на # и все доллары на %.
 | ||
|      * @param string $subject Строка, в которой нужно выполнить замену.
 | ||
|      * @param string $encoding (необязательный) Кодировка (по умолчанию, UTF-8).
 | ||
|      *
 | ||
|      * @return string Возвращает новую строку с выполненными заменами.
 | ||
|      */
 | ||
|     public static function ReplaceAll (array $searchReplace, string $subject, string $encoding = 'UTF-8'): string
 | ||
|     {
 | ||
|         // Создаю результат
 | ||
|         $result = $subject;
 | ||
| 
 | ||
|         // Для каждой пары поиска и замены
 | ||
|         foreach ($searchReplace as $search => $replace)
 | ||
|             // - заменяю все вхождения строки поиска на строку замены в заданной строке
 | ||
|             $result = self::Replace($search, $replace, $result, $encoding);
 | ||
| 
 | ||
|         // Возвращаю результат
 | ||
|         return $result;
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * Функция заменяет все вхождения строки поиска на строку замены в заданной строке (аналог mb_str_replace).
 | ||
|      *
 | ||
|      * @param string $search Строка, которую нужно найти и заменить.
 | ||
|      * @param string $replace Строка, на которую нужно заменить найденную строку.
 | ||
|      * @param string $subject Строка, в которой нужно выполнить замену.
 | ||
|      * @param string $encoding (необязательный) Кодировка (по умолчанию, UTF-8).
 | ||
|      *
 | ||
|      * @return string Возвращает новую строку с выполненной заменой.
 | ||
|      */
 | ||
|     public static function Replace (string $search, string $replace, string $subject,
 | ||
|         string $encoding = 'UTF-8'): string
 | ||
|     {
 | ||
|         // Если кодировка не UTF-8
 | ||
|         if ($encoding != 'UTF-8') {
 | ||
|             // - то перекодируем строку поиска, замены и исходную строку в UTF-8
 | ||
|             $search = mb_convert_encoding($search, 'UTF-8', $encoding);
 | ||
|             // - и перекодируем строку замены в UTF-8
 | ||
|             $replace = mb_convert_encoding($replace, 'UTF-8', $encoding);
 | ||
|             // - и перекодируем исходную строку в UTF-8
 | ||
|             $subject = mb_convert_encoding($subject, 'UTF-8', $encoding);
 | ||
|         }
 | ||
| 
 | ||
|         // С помощью регулярного выражения заменяем все вхождения строки поиска на строку замены
 | ||
|         $result = preg_replace('/' . preg_quote($search, '/') . '/u', $replace, $subject);
 | ||
| 
 | ||
|         // Если кодировка не UTF-8
 | ||
|         if ($encoding != 'UTF-8')
 | ||
|             // - то перекодируем результат в исходную кодировку
 | ||
|             $result = mb_convert_encoding($result, $encoding, 'UTF-8');
 | ||
| 
 | ||
|         // Возвращаем результат
 | ||
|         return $result;
 | ||
|     }
 | ||
| } |