【问题标题】:Replace text between all the strings替换所有字符串之间的文本
【发布时间】:2020-12-17 05:01:43
【问题描述】:

我有多个字符串,我想更改第一个字符串和最后一个字符串之间的字符串。

中间的字符串是动态的,它会发生变化,但第一个和最后一个字符串保持不变。

例如这是字符串,

请注意,这是整个字符串。

%22%3A%7B%22id%22%3A%22XXXXXXXXXXXXXXXXXXXXXX%22%7D%2C%22 %22%3A%7B%22id%22%3A%22YYYYYYYYYYYYYYYYYYYYYY%22%7D%2C%22 %22%3A%7B%22id%22%3A%22ZZZZZZZZZZZZZZZZZZZZZZ%22%7D%2C%22

那么有没有什么函数可以找到所有中间字符串的第一个和最后一个字符串?

我试过这个功能,

private function replace_between($str, $needle_start, $needle_end, $replacement)
    {
    
        $pos = strpos($str, $needle_start);

        $start = $pos === false ? 0 : $pos + strlen($needle_start);
    
        $pos = strpos($str, $needle_end, $start);
        $end = $pos === false ? strlen($str) : $pos;
    
        return substr_replace($str, $replacement, $start, $end - $start);
    }

此函数仅替换第一次出现。我想改变所有的出现。

Output of this function

%22%3A%7B%22id%22%3A%22REPLACED___TEXT%22%7D%2C%22
%22%3A%7B%22id%22%3A%22YYYYYYYYYYYYYYYYYYYYYY%22%7D%2C%22
%22%3A%7B%22id%22%3A%22ZZZZZZZZZZZZZZZZZZZZZZ%22%7D%2C%22

它不会改变其他中间字符串。

谢谢!

【问题讨论】:

  • 请举例说明您如何调用replace_between()
  • 如果字符串由空格分隔(在提供的示例中看起来像这样),您可以使用空格作为分隔符 explode 它。分解数组的第二个元素应该给出第二个字符串..
  • @ariefbayu eplace_between(ORIGINAL_STRING,"%22%3A%7B%22id%22%3A%","%22%7D%2C%22","REPLACETEXT") 这将替换第一次出现但所有其他事件都不会改变
  • @user3532758 你在说什么?我没明白。我想替换两个字符串之间的字符串。我为什么要炸它?
  • 所以,假设你有 3 行,你想替换这 3 行之间的所有内容,只有一个 ""REPLACE TEXT"?我的意思是,所有三行都将具有相同的内容。 @AbhishekDeshkar

标签: php regex laravel


【解决方案1】:

您可以为此使用preg_replace()

<?php
// Your code here!
$string = "%22%3A%7B%22id%22%3A%22XXXXXXXXXXXXXXXXXXXXXX%22%7D%2C%22 %22%3A%7B%22id%22%3A%22YYYYYYYYYYYYYYYYYYYYYY%22%7D%2C%22 %22%3A%7B%22id%22%3A%22ZZZZZZZZZZZZZZZZZZZZZZ%22%7D%2C%22";

$replaceInto = "---REPLACED---";
$pattern = '/\%22\%3A\%7B\%22id\%22\%3A\%22(.*)\%22\%7D\%2C\%22/U';

$result = preg_replace($pattern, "%22%3A%7B%22id%22\%3A%$replaceInto%22%7D%2C%22", $string);

var_dump($result);

请注意,我在$pattern 中使用了后缀U。这称为'Nongreedy' 修饰符。

这将导致以下结果:

字符串(176)“%22%3A%7B%22id%22%3A%---已替换---%22%7D%2C%22 %22%3A%7B%22id%22%3A%- --已替换---%22%7D%2C%22 %22%3A%7B%22id%22%3A%---已替换---%22%7D%2C%22"

这是Paiza.IO的在线测试。

【讨论】:

  • 非常感谢!有效。不过这里有变化,应该是这样的。 preg_replace($pattern,"%22%3A%7B%22id%22%3A%22$replaceInto%22%7D%2C%22", $string);
【解决方案2】:

@user3532758 你在说什么?我没明白。我想要 替换两个字符串之间的字符串。我为什么要炸它?

$string = "%22%3A%7B%22id%22%3A%22XXXXXXXXXXXXXXXXXXXXXX%22%7D%2C%22 %22%3A%7B%22id%22%3A%22YYYYYYYYYYYYYYYYYYYYYY%22%7D%2C%22 %22%3A%7B%22id%22%3A%22ZZZZZZZZZZZZZZZZZZZZZZ%22%7D%2C%22";

$exploded = explode(" ", $string);

$exploded[1] = "replaced string";

echo implode($exploded, " ");

// result: %22%3A%7B%22id%22%3A%22XXXXXXXXXXXXXXXXXXXXXX%22%7D%2C%22 replaced string %22%3A%7B%22id%22%3A%22ZZZZZZZZZZZZZZZZZZZZZZ%22%7D%2C%22

【讨论】:

  • 为什么要加空格?我已经编辑了这个问题。请再看一遍。
猜你喜欢
  • 1970-01-01
  • 2015-04-08
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 2019-12-25
  • 1970-01-01
相关资源
最近更新 更多