まず第一に、あなたは文字通りのみ何十すべての分を行っている場合は、その後、私はこのケースでパフォーマンスについてそれほど心配しないでしょう。これらの試合はかなり速いです、と私はあなたのパターンの配列を反復処理し、別にこのようするpreg_matchを呼び出すことにより、パフォーマンスの問題を持っているつもりだとは思わない:
$matches = false;
foreach ($pattern_array as $pattern)
{
if (preg_match($pattern, $page))
{
$matches = true;
}
}
あなたが本当に一つに、すべてのパターンを組み合わせることができますいくつかの人々のようにor
演算子を使用して、示唆しているだけで一緒に|
を叩かないでください。あなたのパターンのいずれかがに含まれている場合、これはひどく壊れますまたは演算子。
私は次のように括弧を使用してパターンをグループ化し、少なくとも推薦:
foreach ($patterns as $pattern)
{
$grouped_patterns[] = "(" . $pattern . ")";
}
$master_pattern = implode($grouped_patterns, "|");
しかし...私はこれが速くなってしまう場合は本当にわかりません。 何かはpreg_matchかPHPかに関わらず、それらをループする必要があります。私が推測しなければならなかったのは、個々の試合が速くて読みやすく、維持しやすいと思います。
最後に、パフォーマンスがここで探しているものであれば、最も重要なのは、正規表現以外のマッチを単純な「文字列を含む」チェックに引き出すことだと思います。私はあなたの小切手のいくつかは、 "This Site is Closed"がページにあるかどうかを調べるような簡単な文字列チェックでなければならないと思います。
だから、このやって:
foreach ($strings_to_match as $string_to_match)
{
if (strpos($page, $string_to_match) !== false))
{
// etc.
break;
}
}
foreach ($pattern_array as $pattern)
{
if (preg_match($pattern, $page))
{
// etc.
break;
}
}
をし、できるだけ多くのpreg_match()
を回避することはおそらくあなたの最善の利益になるだろう。 strpos()
はロットで、preg_match()
より速い。
Google社員のために、マッチを見つけたら、foreachループから脱出するためにbreak(http://www.php.net/manual/en/control-structures.break.php)を使用することを検討してください!あなたのコメントに対処するために編集され、少なくともPHP –
私はこれがあるべきと考えています。 – hellomynameisjoel
さてさて君たちの私のバージョンでのforeach($パターンとしての$ pattern_array)、...: – danieltalsky