【问题标题】:Using preg_replace_callback with shortcodes将 preg_replace_callback 与短代码一起使用
【发布时间】:2014-02-20 23:01:23
【问题描述】:

我正在尝试在我的网站上实施短代码以简化发布。到目前为止我得到的看起来像这样:

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

我想要回应的是:&lt;button&gt;Hello&lt;/button&gt; &lt;input type="text" value="holololo" /&gt;

但它只是回显:[button]Hello[button] [input]holololo[inp​​ut]

我做错了什么?

【问题讨论】:

    标签: php preg-replace-callback


    【解决方案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">
    

    【讨论】:

    • 如果我只有这样的标签,它不会只显示一个按钮:[button][button],而且我的 php 不太好,你能帮帮我吗?
    • @Murillio4 这实际上不是 PHP 问题,只是您的正则表达式略有变化:(.+?) 表示 一个或多个 任何字符。如果您将其更改为(.*?),则表示任何字符的零个或多个。换句话说,这让它根本不匹配任何东西。但是请注意,这会给您一个没有文字的按钮。
    猜你喜欢
    • 2017-05-06
    • 2012-06-23
    • 2010-11-06
    • 2023-04-11
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多