我有一条短信:
foo {{bar}} foo {{bar}} foo
我有一个数组:
$bar[0] = 'lol';
$bar[1] = 'kek';
嗯,我想输入一条文字:
foo lol foo kek foo
此:
preg_replace("/{{bar}}/usi",$bar,$text);
不起作用。
答案 0 :(得分:2)
您可以通过使用limit
参数preg_replace
遍历替换数组来获得所需的结果,以防止它一次替换多个值:
foreach ($bar as $b) {
$string = preg_replace('/{{bar}}/usi', $b, $string, 1);
}
echo $string;
输出:
foo lol foo kek foo
答案 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。
要使匿名回调函数正常工作,您可能需要PHP v5.4或更高版本。