diff --git a/anb_python_components/extensions/StringExtension.php b/anb_python_components/extensions/StringExtension.php new file mode 100644 index 0000000..9e52f99 --- /dev/null +++ b/anb_python_components/extensions/StringExtension.php @@ -0,0 +1,136 @@ +['-' => '#', '$' => '%'] + * заменит все дефисы на # и все доллары на %. + * @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; + } +} \ No newline at end of file diff --git a/anb_python_components/extensions/string_extension.py b/anb_python_components/extensions/string_extension.py index b7c930e..951c119 100644 --- a/anb_python_components/extensions/string_extension.py +++ b/anb_python_components/extensions/string_extension.py @@ -1,7 +1,6 @@ # anb_python_components/extensions/string_extension.py -from typing import Any -from string_extension_constant import StringExtensionConstant +from string_extension_constant import StringExtensionConstants class StringExtension: @@ -15,557 +14,84 @@ class StringExtension: """ pass + @classmethod def is_null_or_empty(cls, text: str) -> bool: """ Проверяет, пуста ли строка. - :param str: Проверяемая строка. + :param text: Проверяемая строка. :return: Результат проверки. """ return text is None or text == "" - def is_null_or_whitespace (cls, text: str) -> bool: + @classmethod + def is_null_or_whitespace(cls, text: str) -> bool: """ Проверяет, пуста ли строка, содержит ли вместо текста только пробелы. :param text: Проверяемая строка. - :return: bool Результат проверки. :rtype: bool + :return: Bool Результат проверки. """ return cls.is_null_or_empty(text) or text.strip() == '' - def Compare(self, str1, str2, ignore_case=False): - (""" - Сравнивает две строки. - :param str1: Первая строка. - :param str2: Вторая строка. - :param ignore_case: Игнорировать регистр. По умолчанию, False. - :return: Результат сравнения. Возвращаемые значения: - -1 | значение $str1 меньше значения $str2. - 0 | значения $str1 и $str2 равны. - 1 | значение $str1 больше значения $str2. + @classmethod + def is_russian_letter(cls, letter: str) -> bool: + """ + Проверяет, является ли символ русским буквой. + :param letter: Проверяемый символ. + :return: Результат проверки. """ - # Если обе строки пусты - # if (self::IsNullOrWhitespace($str1) and self::sNullOrWhitespace($str2)): - # // - то равны 0 - # return 0; -// Если -первый -из -них -не -пуст, а -второй -пуст -if (!self::IsNullOrWhitespace($str1) & & self: : -IsNullOrWhitespace($str2)) -// - то -первый -больше -return 1; + return letter in StringExtensionConstants.russian_letters -// Если -первый -из -них -пуст, а -второй -не -пуст -if (!self::IsNullOrWhitespace($str1) & & self: : -IsNullOrWhitespace($str2)) -// - то -первый -меньше -return -1; + @classmethod + def get_russian_letter_transliteration(cls, letter: str) -> bool | None: + """ + Получаю транслитерированную букву русского алфавита. + :param letter: Буква русского алфавита. + :return: Транслитерированная буква. + """ + # Если размерность массивов разная + if (len(StringExtensionConstants.russian_letters) != + len(StringExtensionConstants.russian_letters_transliteration)): + # - то вывожу ошибку + return None -// Если -нужно -игнорировать -регистр -if ($ignoreCase) - // - то - сравниваем - по - "человечески" - без - учёта - регистра - return strnatcasecmp($str1, $str2); + # Получаю индекс буквы + ind = StringExtensionConstants.russian_letters.find(letter) - // Иначе - сравниваем - по - "человечески" - с - учётом - регистра - return strnatcmp($str1, $str2); - } + # Если индекс буквы не найден + if ind == -1: + # - то вывожу ошибку + return None - + # Получаю транслитерированную букву + return StringExtensionConstants.russian_letters[ind] + @classmethod + def convert_to_latin(cls, source: str) -> str: + """ + Конвертация в латиницу. + :param source: Исходная строка. + :return: Результат перевода. + """ + # Создаю результат + result = "" + # Получаю длину строкиДля каждой буквы или символа из слова + for i, letter in enumerate(source): + if cls.is_russian_letter(letter): + # - транслитерирую эту букву + result_transliteration = cls.get_russian_letter_transliteration(letter) - / ** - *Конвертация - в - латиницу. - * - * @ param - string $source - Исходное - слово - или - выражение - * - * @ - return string - Транслитерированное - слово - или - выражение - * / - public - static - function - ConvertToLatin(string $source): string - { - // Создаю - результат - $result = ""; + # - если транслитерация не удалась + if result_transliteration is None: + # -- вывожу оригинальную букву + result += letter + else: + # -- вывожу транслитерированную букву + result += result_transliteration + else: + # - иначе вывожу букву или символ + result += letter - // Длина - исходного - слова - $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; -} -} + # Вывожу результат + return result