简体   繁体   中英

Why str_replace is not replacing correctly

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

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. eg

$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

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 (ie from shortest string to longest string)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM