1

以前我一直在回应 $obj->html 但当前的项目要求检查 HTML 中是否存在类似 slug{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->html:

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

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

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

为什么要new_releases()预先输出输出?蛞蝓不见了,但替代品不在它的位置!

4

1 回答 1

1

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

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

恕我直言,您应该用唯一的功能替换您的preg_match测试和您的,尝试这样的事情(并纠正错误:)。preg_replacepreg_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;
}
于 2013-06-18T23:27:30.003 回答