假设我有一个字符串
$str = "abc*efg*hij*";
和一个数组
$arr = array("123","456","789");
现在我想根据位置将*
中的$str
替换为$arr
中的元素。第一个*
替换为$arr[0]
,第二个替换为$arr[1]
等。我检查函数str_replace,虽然它接受数组作为参数,但我发现它不起作用。我不能只使用
$newstr = "abc{$arr[0]}efg{$arr[1]}hij{$arr[2]}"
因为真正的$str
可能是一个很长的字符串,有很多*
。有什么好主意吗?谢谢。
答案 0 :(得分:12)
如果*
是您唯一的格式字符,请尝试将*
转换为%s
(也将现有的%
转换为%%
),然后使用{{ 3}},它接受一组值作为格式参数传入:
$str = str_replace(array('%', '*'), array('%%', '%s'), $str);
$newstr = vsprintf($str, $arr);
echo $newstr;
输出:
abc123efg456hij789
请注意,如果您有比星号更多的数组元素,则末尾的额外元素将不会出现在字符串中。如果您有更多的星号而不是数组元素,vsprintf()
将发出太少的参数警告并返回false
。
答案 1 :(得分:1)
您可以随时使用preg_replace()
保持简单并使用$limit
参数,如下所示:
for($i = 0; $i < count($arr); $i++)
$str = preg_replace('/\*/', $arr[$i], $str, 1);
但为了实用,@ BoltClock的答案是更好的选择,因为a)不涉及循环,但更重要的是b)不被强制使用正则表达式。