提高正则表达式的速度并使用preg_replace来实现slug

时间:2013-06-18 23:24:21

标签: php regex slug

以前我一直在回应$ obj-> html,但是当前的项目要求检查HTML,例如{whatever},并将其替换为其他内容。

我有两个问题。首先是这段代码比我想要的慢:

class Foo {

  function draw_content() {
    $slug = "/(?<=\{).*(?=\})/";
    if (preg_match($slug, $this->html, $matches)) {
        foreach ($matches as $match) {
            if (method_exists($this,$match))    {
                $replacement = $this->$match();
                $this->html = preg_replace("/\{$match\}/", $replacement, $this->html);
            }
        }
    } 
    return $this->html;
 } // fn

  function new_releases() {
    echo "new release book covers"; 
  }  // fn

} // class

有没有更好的方法来获取slug内容?我认为正则表达式会减慢它的速度吗?

第二个问题对我来说很陌生。鉴于此$ obj-&gt; html:

<p class="headline">New Releases</p>
<p>xxx{new_releases}xxxx</p>

$ obj-&gt; draw_content()的处理输出由<?=$obj->draw_content()?>

绘制
new release book covers<p class="headline">New Releases</p>
<p>xxxxxxx</p>

为什么new_releases()输出前置? slu is已经消失,但替换不在它的位置!

1 个答案:

答案 0 :(得分:1)

您可以通过以下方式替换您的模式:

$slug = '~{\K[^}]*+(?=})~';

恕我直言,您应该用preg_match函数替换preg_replace测试和preg_replace_callback,尝试这样的事情(并更正错误:)。

function draw_content() {
    $slug = '~{([^}]*+)}~';
    $that = $this;
    $this->html = preg_replace_callback( $slug, function ($m) use ($that) {
        if (method_exists($that, $m[1]))
            return $that->$m[1]();
        return $m[0]; }, $this->html);
    return $this->html;
}