是否有更快的替代preg函数和正则表达式

时间:2015-05-07 16:02:50

标签: php regex preg-replace

我正在寻找一种更好的方法来为我的网络代理编码插件。它涉及解析用户想要的页面的html,除非东西(广告,恼人的js等......)并将页面提供给页面用户。

剥离,除非使用preg_replace and regex完成部分。是的,我知道DOMDocument建议使用正则表达式而不是preg_replace is faster效果这是至关重要的,因为我需要尽快为用户提供免费系统资源。

以下是典型的preg_replace语句

的示例

$input = preg_replace('#<div id="above-related".*?</div>#s', '', $input); 在一个典型的插件中,可能有4-15个preg_replace语句。

我可以优化剥离除非东西部分

1 个答案:

答案 0 :(得分: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)。

如果您能找到非正则表达式匹配,或者甚至是每个规则的非正则表达式替换策略,那么您将会看到显着的加速。