如何使用preg_match替换数组

时间:2019-05-30 08:53:08

标签: php regex

我有一条短信:

foo {{bar}} foo {{bar}} foo

我有一个数组:

$bar[0] = 'lol';
$bar[1] = 'kek';

嗯,我想输入一条文字:

foo lol foo kek foo

此:

preg_replace("/{{bar}}/usi",$bar,$text);

不起作用。

2 个答案:

答案 0 :(得分:2)

您可以通过使用limit参数preg_replace遍历替换数组来获得所需的结果,以防止它一次替换多个值:

foreach ($bar as $b) {
    $string = preg_replace('/{{bar}}/usi', $b, $string, 1);
}

echo $string;

输出:

foo lol foo kek foo

Demo on 3v4l.org

答案 1 :(得分:0)

另一个想法是preg_replace_callback(),并在回调中增加一个变量以计算当前匹配数。一个优点是,它可以很好地调整。


#include <iostream>
#include <pthread.h>

class Base {
public:
    Base(int state) noexcept : b{state} {}

    void foo();

private:
    int b;

    void fpga_read() {
        std::cout << "Value of B inside thread class" << b;
    }
};

void Base::foo()
{
    pthread_t thread;
    pthread_create(&thread, nullptr, [](void* that) -> void* {
        Base* this_ = static_cast<Base*>(that);
        this_->fpga_read();
        return nullptr;
    }, static_cast<void*>(this));
    pthread_join(thread, nullptr);
}
  • $i = -1; $res = preg_replace_callback('/{{bar}}/', function($m) use ($bar, &$i) { ++$i; return isset($bar[$i]) ? $bar[$i]: $m[0]; }, $str); 是当前比赛的计数器,并在每次比赛时递增。
    在第一次匹配时,$i的值为$i,因为它是用0初始化的(不匹配)。
    要从回调函数内部修改-1,请修改为$i passed by reference

  • &用于检查是否存在相应的数组元素。
    如果不存在(字符串中的匹配项多于数组元素),则返回match。

Here is a demo at 3v4l.org

要使匿名回调函数正常工作,您可能需要PHP v5.4或更高版本。