用不同的值替换多次出现的字符串

时间:2011-09-25 05:25:28

标签: php string replace str-replace

我有一个脚本可以生成包含某些令牌的内容,我需要替换令牌的每次出现,并使用不同的内容从单独的循环中生成。

使用str_replace将所有出现的令牌替换为相同的内容很简单,但我需要用循环的下一个结果替换每个匹配项。

我确实看到了这个答案:Search and replace multiple values with multiple/different values in PHP5?

但它是使用预定义的数组,我没有。

示例内容:

This is an example of %%token%% that might contain multiple instances of a particular
%%token%%, that need to each be replaced with a different piece of %%token%% generated 
elsewhere.

为了参数的缘故,我需要用生成的内容替换每次出现的%% token %%,这个简单的循环:

for($i=0;$i<3;$i++){
    $token = rand(100,10000);
}

所以用不同的随机数值$ token替换每个%%标记%%。

这是不是很简单,我只是没有看到?

谢谢!

4 个答案:

答案 0 :(得分:5)

我认为您无法使用任何搜索和替换功能执行此操作,因此您必须自行编写替换代码。

我认为这个问题适用于explode()。因此,使用您提供的示例令牌生成器,解决方案如下所示:

$shrapnel = explode('%%token%%', $str);
$newStr = '';
for ($i = 0; $i < count($shrapnel); ++$i)  {
    // The last piece of the string has no token after it, so we special-case it
    if ($i == count($shrapnel) - 1)
        $newStr .= $shrapnel[$i];
    else
        $newStr .= $shrapnel[$i] . rand(100,10000);
}

答案 1 :(得分:1)

我知道这是一个老线程,但我在尝试实现类似的东西时偶然发现了它。如果有人看到这个,我认为这有点好看:

创建一些示例文本:

$text="This is an example of %%token%% that might contain multiple instances of a particular
%%token%%, that need to each be replaced with a different piece of %%token%% generated 
elsewhere.";

使用正则表达式查找搜索字符串:

$new_text = preg_replace_callback("|%%token%%|", "_rand_preg_call", $text);

定义回调函数以更改匹配

function _rand_preg_call($matches){
  return rand(100,10000);
}

回应结果:

echo $new_text;

所以作为一个功能集:

function _preg_replace_rand($text,$pattern){
  return preg_replace_callback("|$pattern|", "_rand_preg_call", $text);
}

function _rand_preg_call($matches){
  return rand(100,10000);
}

答案 2 :(得分:1)

我有一个类似的问题,我有一个我需要阅读的文件。它有多次出现令牌,我需要用数组中不同的值替换每个出现。

此函数将替换“haystack”中找到的每个“token”/“needle”,并将其替换为索引数组中的值。

function mostr_replace($needle, $haystack, $replacementArray, $needle_position = 0, $offset = 0)
{
    $counter = 0;
    while (substr_count($haystack, $needle)) {

        $needle_position = strpos($haystack, $needle, $offset);
        if ($needle_position + strlen($needle) > strlen($haystack)) {
            break;
        }
        $haystack = substr_replace($haystack, $replacementArray[$counter], $needle_position, strlen($needle));
        $offset = $needle_position + strlen($needle);
        $counter++;
    }

    return $haystack;
}

顺便说一下,'mostr_replace'是“多次出现字符串替换”的缩写。

答案 3 :(得分:0)

您可以使用以下代码:

$content = "This is an example of %%token%% that might contain multiple instances of a particular %%token%%, that need to each be replaced with a different piece of %%token%% generated elsewhere.";

while (true)
{
    $needle = "%%token%%";
    $pos = strpos($content, $needle);
    $token = rand(100, 10000);
    if ($pos === false)
    {
        break;
    }
    else
    {
        $content = substr($content, 0,
                          $pos).$token.substr($content, $pos + strlen($token) + 1);
    }
}