Tout d'abord, si vous ne faites que des dizaines littéralement chaque minute , alors je ne vous inquiétez pas terriblement de la performance dans ce cas. Ces résultats sont assez rapides, et je ne pense pas que vous allez avoir un problème de performance par itérer vos modèles tableau et appelant preg_match comme séparément ceci:
$matches = false;
foreach ($pattern_array as $pattern)
{
if (preg_match($pattern, $page))
{
$matches = true;
}
}
Vous pouvez en effet combiner tous les modèles en un seul en utilisant l'opérateur or
comme certaines personnes le suggèrent, mais ne les appliquez pas simplement avec un |
. Cela va mal casser si l'un de vos modèles contient l'opérateur ou.
je recommande au moins grouper vos modèles en utilisant comme entre parenthèses:
foreach ($patterns as $pattern)
{
$grouped_patterns[] = "(" . $pattern . ")";
}
$master_pattern = implode($grouped_patterns, "|");
Mais ... Je ne suis pas vraiment sûr si cela finit par être plus rapide. Quelque chose doit faire une boucle à travers eux, que ce soit le preg_match ou PHP. Si je devais deviner, je devinerais que les matchs individuels seraient aussi rapides et faciles à lire et à maintenir. Enfin, si la performance est ce que vous cherchez ici, je pense que la chose la plus importante à faire est de sortir les correspondances non regex dans une simple vérification "chaîne contient". J'imagine que certaines de vos vérifications doivent être de simples vérifications de chaînes comme si vous cherchiez à voir si «Ce site est fermé» se trouve sur la page.
fait donc ceci:
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;
}
}
et en évitant autant que possible preg_match()
va probablement être votre meilleur gain. strpos()
est un lot plus rapide que preg_match()
.
Pour le bien du Googler, pensez à utiliser break (http://www.php.net/manual/fr/control-structures.break.php) pour sortir de la boucle foreach une fois que vous avez trouvé un match! –
Je crois que cela devrait être: foreach ($ pattern_array as $ pattern), au moins dans ma version de PHP – hellomynameisjoel
Très bien vous les gars ... édité pour répondre à vos commentaires. – danieltalsky