Prima di tutto, se si sta solo facendo letteralmente decine ogni minuto, quindi io non mi preoccuperei terribilmente per le prestazioni in questo caso. Queste partite sono piuttosto veloce, e non credo che si sta andando ad avere un problema di prestazioni scorrendo l'array modelli e chiamando preg_match separatamente come questo:
$matches = false;
foreach ($pattern_array as $pattern)
{
if (preg_match($pattern, $page))
{
$matches = true;
}
}
È possibile infatti combinare tutti i modelli in una sola utilizzando l'operatore or
come suggeriscono alcune persone, ma non limitarsi a schiacciarle insieme con un |
. Questo si interromperà se uno qualsiasi dei tuoi modelli contiene l'operatore o.
lo consiglio almeno raggruppare i vostri modelli usando le parentesi come:
foreach ($patterns as $pattern)
{
$grouped_patterns[] = "(" . $pattern . ")";
}
$master_pattern = implode($grouped_patterns, "|");
Ma ... io non sono davvero sicuro se questo finisce per essere più veloce. Qualcosa da fare deve passarci sopra, che si tratti del preg_match o del PHP. Se dovessi indovinare, immagino che le singole corrispondenze siano tanto più facili da leggere e da mantenere.
Infine, se la prestazione è ciò che stai cercando qui, penso che la cosa più importante da fare sia estrarre le corrispondenze non regex in un semplice controllo "stringa contiene". Immagino che alcuni dei tuoi assegni debbano essere semplici controlli sulle stringhe, come cercare di vedere se "Questo sito è chiuso" è nella pagina.
Così facendo questo:
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;
}
}
ed evitare il maggior numero preg_match()
possibile è destinata probabilmente ad essere il vostro migliore guadagno. strpos()
è un lotto più veloce di preg_match()
.
Per motivi di googler, considera di utilizzare break (http://www.php.net/manual/en/control-structures.break.php) per uscire dal ciclo foreach una volta trovata una corrispondenza! –
Credo che dovrebbe essere questo: foreach ($ pattern_array as $ pattern), almeno nella mia versione di PHP – hellomynameisjoel
Va bene ragazzi ... modificato per indirizzare i vostri commenti. – danieltalsky