Прежде всего, если вы буквально делаете только дюжины каждые минуты , то я бы не стал сильно беспокоиться о производительности в этом случае. Эти совпадения довольно быстрые, и я не думаю, что у вас возникнут проблемы с производительностью, если вы будете выполнять итерацию по массиву шаблонов и вызывать preg_match отдельно, например так:
$matches = false;
foreach ($pattern_array as $pattern)
{
if (preg_match($pattern, $page))
{
$matches = true;
}
}
Вы действительно можете объединить все шаблоны в один, используя оператор or
, как предлагают некоторые люди, но не просто соедините их вместе с |
. Это будет плохо работать, если любой из ваших шаблонов содержит оператор or.
Я бы рекомендовал, по крайней мере, группировать ваши шаблоны, используя круглые скобки, например:
foreach ($patterns as $pattern)
{
$grouped_patterns[] = "(" . $pattern . ")";
}
$master_pattern = implode($grouped_patterns, "|");
Но ... Я не совсем уверен, что это закончится быстрее. Что-то должно пройти через них, будь то preg_match или PHP. Если бы мне пришлось угадывать, я бы предположил, что отдельные совпадения были бы такими же быстрыми, их было бы легче читать и поддерживать.
И наконец, если вам нужна производительность, я думаю, что самое важное, что нужно сделать, это вытащить совпадения без регулярных выражений в простую проверку «строка содержит». Я полагаю, что некоторые из ваших проверок должны быть простыми проверками строк, например, посмотреть, есть ли на странице «Этот сайт закрыт».
Делая так:
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()
.