您可以通过减少正则表达式的数量、表达式的复杂性和输入大小来加快匹配速度。
例如你的例子:'#<div id="above-related".*?</div>#s'
您可以使用strpos 和substr 来减小输入的大小:
$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
}
这里的诀窍是 strpos 和 substr 比 preg_replace 快得多(轻松 100 倍)。
如果您可以找到非正则表达式匹配,或者甚至可以为每个规则找到非正则表达式替换策略,那么您将看到显着的加速。