php_components_pack/sources/extensions/StringExtension.php
2025-02-03 18:49:47 +03:00

210 lines
8.3 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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