Как заменить несколько подстрок без замены замененных подстрок?

Помогите как заменить в моем случае в таких вариантах:

$string = "This is simple string";

$search = array (
"This is simple",
"string",
"simple",
"apple");

$replace = array (
"This is red",
"apple",
"false",
"lemon");

$result = str_replace($search, $replace, $string);

Результат должен быть: Это красное яблоко

Не так: Это ложное яблоко ИЛИ ЖЕ Это красный лимон ИЛИ ЖЕ Это ложный красный лимон

Если при каждой замене измененная строка обрезается до некоторой переменной, а затем возвращается позже, результат может быть правильным. Но я не знаю, это мой вариант, но я не мог этого понять.

1

Решение

использование strtr():

$string = "This is simple string";

$search = array
(
"This is simple",
"string",
"simple",
"apple");

$replace = array
(
"This is red",
"apple",
"false",
"lemon");

echo strtr($string,array_combine($search, $replace));

Выход:

This is red apple

Важный

Я должен сообщить читателям, что эта прекрасная функция также необычна. Если вы никогда не использовали эту функцию раньше, я рекомендую вам прочитайте инструкцию а также комментарии под ним.

Главное для этого случая (скорее мой ответ):

Если дано два аргумента, вторым должен быть массив в массиве формы (‘from’ => ‘to’, …). Возвращаемым значением является строка, в которой все вхождения ключей массива были заменены соответствующими значениями. Самые длинные ключи будут опробованы первыми. После замены подстроки ее новое значение больше не будет искать.

При попытке кодирования ОП ключи ($search) упорядочены по убыванию длины. Это приводит поведение функций в соответствие с тем, что ожидают большинство людей.

Однако рассмотрим эту демонстрацию, где ключи (и их значения) слегка перемешаны:

Код: (демонстрация)

$string="This is simple string";
$search=[
"string",  // listed first, translated second, changed to "apple" which becomes "untouchable""apple",  // this never gets a chance
"simple",  // this never gets a chance
"This is simple"  // listed last, but translated first and becomes "untouchable"];
$replace=[
"apple",
"lemon",
"false",
"This is red"];
echo strtr($string,array_combine($search, $replace));

Вы можете быть удивлены, узнав, что это обеспечивает тот же результат: This is red apple

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]