custom str_replace = find(same value) 并替换为数组

custom str_replace = find(same value) and replace with array

我想知道是否可以创建我自己的 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.

谢谢

编辑:如果我能改进这个问题我会很难解释所以我举了一个例子。

简介

一个超级简单的方法就是遍历数组并设置 preg_replace 只替换 1 个项目(而不是每个匹配项)。另一种方法使用字符串函数在 $haystack 中查找 $needle 的位置,改编自 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 来转义这些特殊字符(正如 musashii 在我的回答下方的评论中指出的那样)。

See code in use here

$array = ['cat', 'mole'];
$re = '/\[blank\]/';

foreach($array as $replacement) {
    $text = preg_replace($re, $replacement, $haystack, 1);
}

echo $haystack;

使用字符串函数

See code in use here

$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;

另一种可能是使用 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和return数组$words.
的值 正则表达式

~\Q[blank]\E~

就是不转义[blank]的意思