diff --git a/sources/extensions/StringExtension.php b/sources/extensions/StringExtension.php index d0f792e..4a65a65 100644 --- a/sources/extensions/StringExtension.php +++ b/sources/extensions/StringExtension.php @@ -207,4 +207,63 @@ final class StringExtension // Возвращаю обрезанный текст return mb_substr($text, 0, $lengthWithoutEndDots) . $endDots; } + + /** + * Функция заменяет все вхождения строк поиск на соответствующие строки замены в заданной строке. + * + * @param array $searchReplace Массив с парами поиска и замены. Например, ['-' => '#', '$' => '%'] + * заменит все дефисы на # и все доллары на %. + * @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/tests/extensions/StringExtensionTest.php b/tests/extensions/StringExtensionTest.php index 61184b2..aa0aefd 100644 --- a/tests/extensions/StringExtensionTest.php +++ b/tests/extensions/StringExtensionTest.php @@ -63,4 +63,20 @@ class StringExtensionTest extends TestCase $this->assertEquals('', StringExtension::GetShortText('test', 0)); } -} + + public function testReplace () + { + $this->PrepareForTest(); + + $this->assertEquals('Все 2 ночи и 2 дня 2 друга искали тебя!', + StringExtension::Replace("4", "2", "Все 4 ночи и 4 дня 2 друга искали тебя!")); + } + + public function testReplaceAll () + { + $this->PrepareForTest(); + + $this->assertEquals('Все 5 ночи и 5 дня 2 друга искали тебя!', + StringExtension::ReplaceAll(["4" => "5", "3" => "2"], "Все 4 ночи и 4 дня 3 друга искали тебя!")); + } +} \ No newline at end of file