用不同的琴弦替换同一针

时间:2013-09-12 16:14:21

标签: php regex replace

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

就像那样:

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

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

输出:

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

str_multiple_replace函数如何将三个问号替换为数组内容。

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

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分:2)

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

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

UPDATE:使用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<<<>>>!<<<

答案 2 :(得分:0)

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

PHP printf()根据格式生成输出:

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

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

答案 3 :(得分: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;
}