我有一个字符串如下:
$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
,并且在该字符串中包含两次。
我是否有办法使用函数获取开始和结束位置并使用它们替换它?
答案 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);
$parsed0
有Hi
(您从该函数中获取),并在str_replace
字符串Hi
中NEWVALUE
替换$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);