将preg_replace_callback与短代码一起使用

时间:2014-02-20 23:01:23

标签: php preg-replace-callback

我正在尝试在我的网站上实施短代码,以便更轻松地发布内容。到目前为止我得到的是这样的:

$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 [输入]

我做错了什么?

1 个答案:

答案 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">