有没有办法用数组中的不同值替换字符串中的相同针?
就像那样:
$string = ">>>?<<<>>>?<<<>>>?<<<"; // replacing the three occourances of "?"
// values of array
echo str_multiple_replace($string, array("Hello", "World", "!"));
输出:
">>>Hallo<<<>>>World<<<>>>!<<<"
str_multiple_replace函数如何将三个问号替换为数组内容。
编辑:让内容不影响替换,例如,如果有“?”在数组中,不应该替换它。
答案 0 :(得分:2)
$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<<<>>>!<<<
答案 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;
}