From 9d519321329c299b39302ef26a99886ee020c6a0 Mon Sep 17 00:00:00 2001 From: babaev-an Date: Tue, 30 Sep 2025 23:46:17 +0300 Subject: [PATCH] 20250930 --- .gitignore | 1 + anb_python_components/__init__.py | 3 + anb_python_components/extensions/__init__.py | 1 + .../extensions/string_extension.py | 646 ++++++++++++++++++ 4 files changed, 651 insertions(+) create mode 100644 anb_python_components/__init__.py create mode 100644 anb_python_components/extensions/__init__.py create mode 100644 anb_python_components/extensions/string_extension.py diff --git a/.gitignore b/.gitignore index 6ba0d3f..a0a01fa 100644 --- a/.gitignore +++ b/.gitignore @@ -253,3 +253,4 @@ cython_debug/ # PyPI configuration file .pypirc +/.idea/ diff --git a/anb_python_components/__init__.py b/anb_python_components/__init__.py new file mode 100644 index 0000000..5492e24 --- /dev/null +++ b/anb_python_components/__init__.py @@ -0,0 +1,3 @@ +# anb_python_components/__init__.py + +from . import greet \ No newline at end of file diff --git a/anb_python_components/extensions/__init__.py b/anb_python_components/extensions/__init__.py new file mode 100644 index 0000000..7ba3d65 --- /dev/null +++ b/anb_python_components/extensions/__init__.py @@ -0,0 +1 @@ +# anb_python_components/extensions/__init__.py \ No newline at end of file diff --git a/anb_python_components/extensions/string_extension.py b/anb_python_components/extensions/string_extension.py new file mode 100644 index 0000000..5565ef1 --- /dev/null +++ b/anb_python_components/extensions/string_extension.py @@ -0,0 +1,646 @@ +# anb_python_components/extensions/string_extension.py + + +class StringExtension: + """ + Расширение строк. + """ + __RUSSIAN_LETTERS = set('а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я', 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я') + + / ** + * @ 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; +} +}