1

有没有办法用数组中的不同值替换字符串中的相同针?

像那样:

$string = ">>>?<<<>>>?<<<>>>?<<<";  // replacing the three occourances of "?"
                                    // values of array

echo str_multiple_replace($string, array("Hello", "World", "!"));

输出:

">>>Hallo<<<>>>World<<<>>>!<<<"

函数 str_multiple_replace 怎么能把三个问号替换成数组的内容。

编辑:让内容影响替换,例如,如果有“?” 在数组中,它不应该被替换。

4

4 回答 4

2

使用preg_replace_callback()

$string = ">>>?<<<>>>?<<<>>>?<<<";
$subs   = array('Hello','World','!');
echo preg_replace_callback('#\?#',function ($matches) use (&$subs) {
    return array_shift($subs);
},$string);

或者:

$string = ">>>?<<<>>>?<<<>>>?<<<";
$subs   = array('Hello','World','!');

function str_multiple_replace($string, $needle, $subs) {
  return preg_replace_callback('#'.preg_quote($needle,'#').'#',function ($matches) use (&$subs) {
    return array_shift($subs);
  },$string);
}

echo str_multiple_replace($string,'?',$subs);
于 2013-09-12T16:21:33.107 回答
2

您实际上可以利用vprintf function使此代码非常简单

$string = ">>>?<<<%s>>>?<<<>>>?<<<";
$arr = array('Hello', 'World', '!');
vprintf(str_replace(array('%', '?'), array('%%', '%s'), $string), $subs);

更新:使用 vsprintf 函数的代码:(感谢@ComFreek)

function str_multiple_replace($str, $needle, $subs) {
    return vsprintf(str_replace(array('%', $needle), array('%%', '%s'), $str), $subs);
}

$string = ">>>?<<<%s>>>?<<<>>>?<<<";
echo str_multiple_replace($string, '?', array('Hello', 'World', '!'));

输出:

>>>Hello<<<%s>>>World<<<>>>!<<<
于 2013-09-12T16:31:11.227 回答
0

这与您的示例格式不完全相同,但概念相同:

PHPprintf()根据以下格式生成输出:

$string=">>>%s<<<>>>%s<<<>>>%s<<<";
$length=printf($string,"Hello", "World", "!");
Outputs: >>>Hello<<<>>>World<<<>>>!<<<

http://php.net/manual/en/function.printf.php

于 2013-09-12T16:24:24.720 回答
0

蛮力解决方案类似于....

function str_multiple_replace($haystack, $needle, $replacements)
{
   $out = '';
   while ($haystack && count($needle)) {
      $out .= substr($haystack, 0,1);
      $haystack = substr($haystack, 1);
      if (substr($out, -1*strlen($needle)) === $needle) {
         $out = substr($out, 0, -1*strlen($needle)) . array_shift($replacements);
      }
   }
   $out .= $haystack;
   return $out;
}
于 2013-09-12T16:26:19.807 回答