我想知道是否可以创建我自己的str_replace,填写空白见下面的示例:
$words = array('cat','mole');
$find='[blank]';
$string ="Lorem ipsum -[blank]- sit amet, consectetur
adipiscing elit. Donec condimentum augue
sit amet blandit vehicula. Nullam placerat
aliquam dictum. Quisque elementum nisl
sed pellentesque elementum. Aliquam erat
volutpat. Suspendisse potenti. Maecenas [blank]."
echo str_replace ($find,$words,$string);
预期的出局将是:
Lorem ipsum -cat- sit amet, consectetur
adipiscing elit. Donec condimentum augue
sit amet blandit vehicula. Nullam placerat
aliquam dictum. Quisque elementum nisl
sed pellentesque elementum. Aliquam erat
volutpat. Suspendisse potenti. Maecenas mole.
谢谢
编辑:如果我可以改进这个问题,我很难解释,所以我给了一个例子。
答案 0 :(得分:4)
这样做的一个非常简单的方法就是迭代数组并将preg_replace
设置为仅替换1项(而不是每次匹配)。另一种方法使用字符串函数来查找$needle
中$haystack
的位置,并根据this answer进行调整。
以下两种方法均假设$haystack
为输入。样本输入(从OP的问题复制)如下:
$haystack = <<<DOC
Lorem ipsum -[blank]- sit amet, consectetur
adipiscing elit. Donec condimentum augue
sit amet blandit vehicula. Nullam placerat
aliquam dictum. Quisque elementum nisl
sed pellentesque elementum. Aliquam erat
volutpat. Suspendisse potenti. Maecenas [blank].
DOC;
如果您的$needle
未知,因为它可能包含特殊的正则表达式字符,您可以使用preg_quote
来转义这些特殊字符(如{{ 3}}在下面的评论中我的回答)。
$array = ['cat', 'mole'];
$re = '/\[blank\]/';
foreach($array as $replacement) {
$text = preg_replace($re, $replacement, $haystack, 1);
}
echo $haystack;
$array = ['cat', 'mole'];
$needle = '[blank]';
foreach($array as $replacement) {
$pos = strpos($haystack, $needle);
if ($pos !== false) {
$haystack = substr_replace($haystack, $replacement, $pos, strlen($needle));
}
}
echo $haystack;
答案 1 :(得分:0)
另一个可能是使用preg_replace_callback
和一个闭包:
$cnt = 0;
$regex = '~\Q[blank]\E~';
$string = preg_replace_callback(
$regex,
function($match) use ($cnt, $words) {
global $cnt;
if (array_key_exists($cnt, $words)) {
$cnt++;
return $words[$cnt-1];
} else {
return '';
}
},
$string);
echo $string;
这会产生
Lorem ipsum -cat- sit amet, consectetur
adipiscing elit. Donec condimentum augue
sit amet blandit vehicula. Nullam placerat
aliquam dictum. Quisque elementum nisl
sed pellentesque elementum. Aliquam erat
volutpat. Suspendisse potenti. Maecenas mole.
<小时/> 想法是增加一个计数器
$cnt
并返回数组$words
的值
正则表达式
~\Q[blank]\E~
只是意味着[blank]
而不是逃避它。