【问题标题】:calling function inside preg_replace thats inside a function在 preg_replace 中调用函数
【发布时间】:2011-01-06 03:14:24
【问题描述】:

我有一些类似结构的代码

           function bbcode($Text)
           { //$Text = preg_replace("/\[video\](.+?)\[\/video\]/",embed_video($1), $Text);
    return $Text;}

    function embed_video($url){
if (preg_match("/http:\/\/www.youtube.com\/watch\?v=([0-9a-zA-Z-_]*)(.*)/i", $url, $matches)) {
    return '<object width="425" height="350">'.
           '<param name="movie" value="http://www.youtube.com/v/'.$matches[1].'" />'.
           '<param name="wmode" value="transparent" />'.
           '<embed src="http://www.youtube.com/v/'.$matches[1].'&autoplay="0" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350" />'.
           '</object>';
}
    return $url;
    }

$lolcakes = "[video]http://youtube.com/id/xxxxxxpron[/video]";
$lolcakesconverted = bbcode($lolcakes);

问题是它向我吐出一个错误。

解析错误:语法错误,意外的 T_LNUMBER,需要 T_VARIABLE 或 '$'

对如何在 bbcode 函数的 preg_replace 中调用 embed_video 有什么想法吗?

谢谢!

【问题讨论】:

    标签: php function preg-replace syntax-error


    【解决方案1】:

    试试preg_replace_callback

    return preg_replace_callback("/\[video\](.+?)\[\/video\]/", 'embed_video', $Text);
    
    function embed_video($matches)
    {
      return $matches[1] . 'foo';      
    }
    

    【讨论】:

    • 也许我应该更具体一点,embed_video() 里面有另一个 preg_replace
    • 没关系,您可以在 embed_video 中进行任何必要的转换... preg_replace_callback 将调用它来查找任何匹配项并获取结果
    • 如果回调是类方法而不是独立函数,我们可以使用$callback = [ $this, 'method_name' ];
    • 不再支持/e修饰符,使用preg_replace_callback
    【解决方案2】:

    您可以在preg_replace() 上使用“e”修饰符(参见Pattern Modifiers

    return preg_replace("/\[video\](.+?)\[\/video\]/e", "embed_video('$1')", $Text);
    

    告诉preg_replace() 将第二个参数视为 PHP 代码。

    【讨论】:

    • 实际上,“/e”修饰符已被弃用(因为可能导致安全漏洞),您应该改用preg_replace_callback
    猜你喜欢
    • 2012-10-10
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 2016-08-02
    相关资源
    最近更新 更多