strtr()
Функция strtr() в PHP используется для замены подстрок в строке. Она особенно полезна при работе с текстовыми приложениями
Введение
Функция strtr() в PHP выполняет замену подстрок в строке. Она особенно полезна при обработке текста, когда определённые последовательности нужно эффективно заменить. В этой статье рассматриваются её синтаксис, поведение и практическое применение.
Понимание функции strtr()
Функция strtr() поддерживает две сигнатуры:
Сигнатура с массивом
strtr(string $str, array $replace) : stringЗдесь $str — входная строка, а $replace — ассоциативный массив, отображающий подстроки на их замены. Функция заменяет все вхождения ключей соответствующими значениями.
Сигнатура с тремя аргументами
strtr(string $str, string $from, string $to) : stringВ этой форме $from и $to должны быть одинаковой длины. Каждый символ из $from сопоставляется с символом на той же позиции в $to.
Важное поведение: strtr() заменяет подстроки, используя алгоритм «наиболее длинного совпадения». Это означает, что перекрывающиеся шаблоны разрешаются с приоритетом более длинного совпадения, а замены не применяются рекурсивно к результату.
Форма с массивом: замена подстрок
Наиболее распространённое использование strtr() — двухаргументная форма с массивом. Вы передаёте ассоциативный массив, который сопоставляет каждую искомую подстроку со значением, на которое она должна быть заменена.
Здесь strtr() заменяет каждый "H" на "J" и каждый "W" на "Z". Ключи могут быть любой длины, поэтому можно так же легко сопоставлять целые слова, как и отдельные символы:
<?php
$string = "The quick brown fox";
echo strtr($string, ["quick" => "slow", "brown" => "red"]);
// Output: The slow red foxЗамены применяются за один проход
Это поведение, которое часто вводит в заблуждение. strtr() сканирует строку один раз и никогда не повторно проверяет уже замененный текст. Таким образом, вставленное значение не будет снова сопоставлено другим правилом:
<?php
echo strtr("Hi all, I said hello", ["Hi" => "Hello", "hello" => "hi"]);
// Output: Hello all, I said hi"Hi" становится "Hello", но это новое "Hello" не превращается затем в "hi" по второму правилу — замена не рекурсивна. Это делает strtr() безопасным инструментом для взаимной замены двух значений (например, "yes" <-> "no"), чего str_replace() не может сделать за один вызов.
Побеждает наиболее длинное совпадение
Когда на одной позиции могут совпасть два ключа, strtr() всегда отдаёт предпочтение более длинному:
<?php
echo strtr("a b c", ["a b" => "X", "a" => "Y"]);
// Output: X cНесмотря на то что "a" идёт первым в массиве, более длинный ключ "a b" совпадает на этой позиции и имеет приоритет. Порядок в массиве не имеет значения — важна только длина ключа.
Форма с тремя аргументами: посимвольная трансляция
Форма с тремя аргументами сопоставляет отдельные символы. $from и $to должны быть одинаковой длины; каждый символ из $from заменяется символом на той же позиции в $to.
<?php
echo strtr("Hello World", "lo", "LO");
// Output: HeLLO WOrLdКаждый l становится L, а каждый o становится O. Если $from длиннее $to, лишние символы игнорируются. Эта форма удобна для простых замен вроде шифрования или нормализации символов, но может заменять только отдельные символы — используйте форму с массивом, когда нужно заменять многосимвольные подстроки.
strtr() vs str_replace()
Обе функции выполняют замену текста, но ведут себя по-разному:
strtr()работает за один нерекурсивный проход и разрешает конфликты по наиболее длинному совпадению. Замененный текст никогда не сканируется повторно.str_replace()применяет правила последовательно, поэтому более ранняя замена может снова совпасть с более поздним правилом. Она также чувствительна к регистру (используйтеstr_ireplace()для регистронезависимой замены).
Используйте strtr(), когда у вас есть фиксированный набор замен, каждая из которых должна произойти ровно один раз — экранирование, транслитерация или двусторонние замены. Для замен на основе шаблонов используйте preg_replace().
Заключение
Функция strtr() предоставляет эффективный способ замены подстрок в PHP. Она поддерживает как замену на основе массива, так и посимвольную трансляцию через форму с тремя аргументами. Поскольку она работает за один проход, используя логику «наиболее длинного совпадения», она хорошо подходит для одноразовых замен и часто работает быстрее, чем цепочки вызовов str_replace(). Понимание правил одного прохода и наиболее длинного совпадения помогает выбрать правильный инструмент для каждой задачи обработки текста.