如何用变量数组替换单个字符的多次出现

时间:2011-08-13 05:07:23

标签: php

This is a ? ?.

我有上面的字符串。我想用这个数组中的变量替换问号:

array('test', 'phrase');

最终结果:

This is a test phrase.

如何在PHP中完成此操作?

4 个答案:

答案 0 :(得分:9)

您可以使用vsprintf

vsprintf("This is a %s %s.", array("test", "phrase")); // "This is a test phrase."

如果你只有?,那么替换?对于%s:

$str = "This is a ? ?.";   
vsprintf(str_replace("?", "%s", $str), array("test", "phrase"));

答案 1 :(得分:3)

这是一个非常简洁的解决方案:

$in = 'This is a ? ?.';
$ar = array('test', 'phrase');
foreach ($ar as $rep)
    $in = implode($rep, explode('?', $in, 2));

$in现在是最后一个字符串。

评论:

  • 如果问号多于数组元素,则多余的问号仍为
  • 如果数组元素多于问号,则只使用所需的数组
  • 在最终字符串中添加问号,在数组中添加'?'替换

示例:http://codepad.org/TKeubNFJ

答案 2 :(得分:2)

来吧人们,编写一个始终有效的功能有多难?到目前为止发布的所有答案都会为以下输入字符串和替换值提供不正确的结果:

$in="This i%s my ? input ? string";
$replace=array("jo%shn?",3);

一个经常被忽视的问题是,如果更改输入字符串,则可能会再次替换包含原始输入模式的替换值。要解决这个问题,您应该完全构建一个新字符串。此外,sprintf解决方案(可能不正确)假设输入字符串永远不会包含'%s'。原始海报从来没有说过那种情况,所以'%s'应该单独留下。

请尝试使用此功能。它可能不是最快也不是最优雅的解决方案,但至少无论输入如何,它都会提供合理的(ahum)输出结果。

function replace_questionmarks($in,$replace)
{
    $out=""; 
    $x=0;
    foreach (explode("?",$in) as $part) 
    {
        $out.=$part;
        $out.=$replace[$x++];
    }
    return $out;
}

$in="This i%s my ? input ? string";
$replace=array("jo%shn?",3);
print replace_questionmarks($in,$replace);

输出:

This i%s my jo%shn? input 3 string

答案 3 :(得分:1)

这个怎么样:

$str = 'This is a ? ?.';

$replacement = array('test', 'phrase');

foreach ($replacement as $word) {
    if (($pos = strpos($str, '?')) !== false) {
        $str = substr_replace($str, $word, $pos, 1);
    }
}

var_dump($str);

Running sample on ideone.com