我有一个脚本可以生成包含某些令牌的内容,我需要替换令牌的每次出现,并使用不同的内容从单独的循环中生成。
使用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替换每个%%标记%%。
这是不是很简单,我只是没有看到?
谢谢!
答案 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);
}
}