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

时间:2015-09-12 05:55:33

标签: php

我有一个字符串如下:

$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,并且在该字符串中包含两次。

我是否有办法使用函数获取开始和结束位置并使用它们替换它?

3 个答案:

答案 0 :(得分:1)

我建议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字符串HiNEWVALUE替换$var (整个字符串)。所以str_replace按预期工作。希望现在很清楚。

<强>更新

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

答案 1 :(得分:0)

  

你好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);

答案 2 :(得分:0)

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