【问题标题】:String Replace in php not working as expectedphp中的字符串替换无法按预期工作
【发布时间】:2015-09-12 05:55:33
【问题描述】:

我有一个字符串如下:

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

有什么方法可以让我使用函数获取开始和结束位置并使用它们替换它?

【问题讨论】:

  • @Justcode 在我的情况下我需要可能有非常大的字符串可能包含更多重复。我知道第一个字符串和结束字符串,需要放在两者之间。请指导我!
  • @Justcode 它正在替换第一次或第二次出现,依此类推。在我的情况下,我需要替换两个字符串之间的值。希望你现在得到它!
  • 这个先前回答的链接可能会有所帮助-stackoverflow.com/a/9598725/5315670

标签: php


【解决方案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_replaceNEWVALUE 替换字符串$var(整个字符串)中的Hi。所以str_replace 正在按预期工作。希望现在很清楚。

更新

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

【讨论】:

    【解决方案2】:

    你好 NEWVALUE World 这是一个很棒的一天。测试嗨,伙计们,怎么了。

    你不能用 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);
    

    【讨论】:

      【解决方案3】:
      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);
      

      【讨论】:

        猜你喜欢
        • 2012-10-31
        • 2015-02-22
        • 2019-08-01
        • 1970-01-01
        • 2012-06-17
        • 2016-11-12
        • 1970-01-01
        • 2021-08-19
        • 1970-01-01
        相关资源
        最近更新 更多