Почему str_replace не заменяет правильно - PullRequest
0 голосов
/ 25 октября 2018

Вот мой сценарий

$searchArray = array("Coupon Codes", "Coupon Code", "Promo", "Promo Codes");

$replaceArray = array("Promo Code", "Promo Codes", "Coupons", "Coupon Code");

$intoString = "Best Buy Coupon Codes";

print str_replace($searchArray, $replaceArray, $intoString);

Результат: Код купона Best Buy

Ожидаемый результат: Промо-код Best Buy

Версия PHP 5.6.36

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Причина вашего неожиданного результата заключается в том, что str_replace сначала заменит «Коды купонов» на «Промо-код», а затем заменит «Промо» на «Купоны».Чтобы обойти это, используйте форму массива strtr, которая сначала будет обрабатывать самые длинные строки, но, что наиболее важно, не будет заменять какой-либо ранее замещенный текст.например,

$searchArray = array("Coupon Codes", "Coupon Code", "Promo", "Promo Codes");
$replaceArray = array("Promo Code", "Promo Codes", "Coupons", "Coupon Code");
$intoString = "Best Buy Coupon Codes";

// this doesn't work
echo str_replace($searchArray, $replaceArray, $intoString);
// this does
echo strtr($intoString, array_combine($searchArray, $replaceArray));

Выход:

Best Buy Coupons Code
Best Buy Promo Code
0 голосов
/ 25 октября 2018

Как на: http://php.net/manual/en/function.str-replace.php

Because str_replace() replaces left to right, it might replace a previously inserted value when doing multiple replacements. See also the examples in this document.

Вот что происходит:

Коды купонов Best Buy -> Промо-код Best Buy (первая пара) -> Код купона Best Buy (третья пара)

Измените $searchArray$replaceArray) таким образом, чтобы в следующих примерах в них не было предыдущих (т. е. от самой короткой строки до самой длинной строки)

...