W3docs

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() — двухаргументная форма с массивом. Вы передаёте ассоциативный массив, который сопоставляет каждую искомую подстроку со значением, на которое она должна быть заменена.

php— editable, runs on the server

Здесь 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(). Понимание правил одного прохода и наиболее длинного совпадения помогает выбрать правильный инструмент для каждой задачи обработки текста.

Практика

Практика
Какова цель функции strtr в PHP?
Какова цель функции strtr в PHP?
Was this page helpful?