2013-06-18 31 views
1

以前我一直在迴應$ obj-> html,但是當前的項目需要檢查像{whatever}等slu and的HTML並將其替換爲其他內容。提高正則表達式的速度和使用preg_replace的slu 012

我有兩個問題。首先是這個代碼比我想要的要慢:

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()輸出前置? slu is已經消失,但替代品並不在它的位置!

回答

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; 
} 
+0

哇,這是waaaay更快!謝謝!對奇怪的preg_replace()行爲有何看法? – jerrygarciuh

+0

你搖滾!我正在摸索'preg_replace_callback()'文檔。這絕對解決了我的問題! – jerrygarciuh

+1

@jerrygarciuh:爲你感到高興。 –