自定义str_replace = find(相同值)并替换为array

时间:2017-12-01 19:24:40

标签: php arrays regex preg-replace str-replace

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

谢谢

编辑:如果我可以改进这个问题,我很难解释,所以我给了一个例子。

2 个答案:

答案 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}}在下面的评论中我的回答)。

musashii

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

答案 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]而不是逃避它。