2015-05-07 48 views
-3

我正在尋找一個更好的方法來爲我的web代理插件代碼。它涉及解析用戶想要的頁面的html,除非東西(廣告,煩人的js等等......)並將該頁面提供給用戶。有更快的替代preg函數和正則表達式

條,除非東西部分使用preg_replace and regex。沒錯我知道DOMDocument建議在正則表達式,但preg_replace is faster完成。 性能是最重要的,因爲我需要爲用戶儘快提供服務來釋放系統資源。

這是有可能是4-15的preg_replace聲明典型的preg_replace聲明

$input = preg_replace('#<div id="above-related".*?</div>#s', '', $input); 在一個典型的插件的例子。

我可以優化什麼條,除非東西部分

回答

3

您可以通過減少你的正則表達式的數量,表達的複雜性和輸入尺寸加快匹配。

例如,對於您的示例:'#<div id="above-related".*?</div>#s'

您可以通過使用strpossubstr減小輸入的大小:

$input = "<html>..</html>"; 
$offset = 0; 
while ($start = strpos('<div id="above-related"', $input, $offset)) { 
    $end = strpos("</div>", $input, $start); 
    $substr = substr($input, $start, $end); // take the small slice 
    $result = preg_replace('#<div id="above-related".*?</div>#s', '', $substr); 
    // stitch the input back together: 
    $input = substr($input, 0, $start) . $result . substr($input, $end); 
    $offset = $start + 1; // continue looking for more matches 
} 

在您的例子的情況下,更換實際上並未使用比賽因此它可以是一個直線上升幅度:

$input = "<html>..</html>"; 
$offset = 0; 
$match_start = '<div id="above-related"'; 
$match_end = '</div>'; 
while ($start = strpos($match_start, $input, $offset)) { 
    $end = strpos($match_end, $input, $start); 
    $input = substr($input, 0, $start + strlen($match_start)) . substr($input, $end); 
    $offset = $start + 1; // continue looking for more matches 
} 

這裏的竅門是strpossubstrpreg_replace(容易100x)快得多。

如果你可以找到一個非正則表達式的匹配,或者甚至是每個規則的非正則表達式替換策略,那麼你將看到顯着的加速。