我正在尝试在我的网站上实施短代码,以便更轻松地发布内容。到目前为止我得到的是这样的:
$text = "[button]Hello[button] [input]holololo[input]";
$shortcodes = Array( 'button' => '<button>{content}</button>', 'input' => '<input type="text" value="{content}" />' );
$text = preg_replace_callback('(\[([a-z]+?)\](.+?)\[\\\1\])', function ($matches){
if ($shortcodes[$matches[1]]){
return str_replace('{content}', $matches[2], $shortcodes[$matches[1]]);
}else{
return $matches[0];
}
}, $text);
echo $text;
我想要回应的是:<button>Hello</button> <input type="text" value="holololo" />
但它只是回显了:[按钮]你好[按钮] [输入] holololo [输入]
我做错了什么?
答案 0 :(得分:1)
两件事。首先,你的正则表达式是这样的:
'(\[([a-z]+?)\](.+?)\[\\\1\])'
你不想在1之前转义斜杠,否则你实际上是在搜索“\ 1”而不是反向引用。那应该是:
'(\[([a-z]+?)\](.+?)\[\1\])'
此外:
function ($matches) {
您尝试在功能中引用$shortcodes
。但是,这是在函数外部定义的,因此它无法访问它。您必须将任何非全局变量显式传递给函数。处理这样的匿名函数时,请使用use
指令,因此函数定义应如下所示:
function ($matches) use ($shortcodes) {
进行这两个简单的更改给了我这个输出:
<button>Hello</button>
<input type="text" value="holololo">