Why str_replace is not replacing correctly

给你一囗甜甜゛ 提交于 2019-12-02 06:57:48

问题


Here is my script

$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);

Result: Best Buy Coupons Code

Expected Output: Best Buy Promo Code

PHP Version 5.6.36


回答1:


The reason for your unexpected result is that str_replace will first replace "Coupon Codes" with "Promo Code" and then it will later substitute "Promo" with "Coupons". To work around this, use the array form of strtr, which will process the longest strings first, but most importantly will not substitute into any previously substituted text. e.g.

$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));

Output:

Best Buy Coupons Code
Best Buy Promo Code



回答2:


As on: 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.

So here's what happens:

Best Buy Coupon Codes -> Best Buy Promo Code (first pair) -> Best Buy Coupons Code (third pair)

Change $searchArray (and $replaceArray) it in a way that the next examples doesn't include previous ones in them (i.e. from shortest string to longest string)



来源:https://stackoverflow.com/questions/52982379/why-str-replace-is-not-replacing-correctly

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!