php中的字符串替换没有按预期工作


String Replace in php not working as expected

我有一个字符串如下:

$var = "Hello Hi World it is an awesome day. Test Hi guys Whats up";

我正在尝试替换字符串中的值,如下所示:

function get_string_between($string, $start, $end){
        $string = " ".$string;
        $ini = strpos($string,$start);
        if ($ini == 0) return "";
        $ini += strlen($start);
        $len = strpos($string,$end,$ini) - $ini;
        return substr($string,$ini,$len);
        } 
$parsed0 = get_string_between($var, "Hello", "World");
So I get the String in `$parse0` 

和我替换如下:

$varnew = str_replace($parsed0,"NEWVALUE", $var);
echo $varnew;

我得到如下输出:

Hello NEWVALUE World it is an awesome day. Test NEWVALUE guys Whats up

我的预期结果是:

Hello NEWVALUE World it is an awesome day. Test Hi guys Whats up.

这是因为在$parse0中,我得到的结果是Hi,它在该字符串中包含两次。

是否有任何方法我得到开始和结束的位置使用一个函数和替换它使用那些?

我建议preg_replace_callback。检查下面的代码。

function customReplace($string, $start, $end, $value = "NEWVALUE"){
    return preg_replace_callback('/'.$start.'(.*?)'.$end.'/', function($m) use($start, $end){
        return "$start NEWVALUE $end";
    }, $string);
}
$var = "Hello Hi World it is an awesome day. Test Hi guys Whats up";
echo customReplace($var, "Hello", "World");
输出:

Hello NEWVALUE World it is an awesome day. Test Hi guys Whats up

你的代码问题是:

$varnew = str_replace($parsed0,"NEWVALUE", $var);

$parsed0Hi(你从函数中获取),并说str_replace在字符串$var(整个字符串)中用NEWVALUE代替Hi。所以str_replace按预期工作。希望现在明白了。

请查看下面@b263的答案。你也可以使用preg_replace,它不需要回调。

你好NEWVALUE世界这是一个很棒的一天。嗨,大家好。

你不能用str_replace。

$var = "Hello Hi World it is an awesome day. Test Hi guys Whats up";
//$parsed0 = 'Hi';
$varnew = str_replace($parsed0,"NEWVALUE", $var);

因为$parsed0 = 'Hi',字符串中出现的任何'Hi'都将被替换。如果您只想替换第一个出现,您可以执行以下操作

$varnew = preg_replace('/'.$parsed0.'/', ' NEWVALUE ', $var, 1);
function replaceBetween($start, $end, $replacement, $subject) {
  return preg_replace("/(${start}'s+).*?('s+${end})/", "$1${replacement}$2", $subject);
}
$var = 'Hello Hi World it is an awesome day. Test Hi guys Whats up';
echo replaceBetween('Hello', 'World', 'NEWVALUE', $var);