20251001-1

This commit is contained in:
2025-10-01 23:10:49 +03:00
parent a96a51b9f9
commit 9bf4a43cce
2 changed files with 195 additions and 533 deletions

View File

@@ -0,0 +1,136 @@
<?php
namespace goodboyalex\php_components_pack\extensions;
/**
* Расширение строк.
*
* @author Александр Бабаев
* @package php_components_pack
* @version 1.0
* @since 1.0
*/
final class StringExtension
{
/**
* Сравнивает две строки.
*
* @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);
}
/**
* Обрезает строку до указанных в параметре $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;
}
}

View File

@@ -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