Sto scrivendo uno script PHP che accetta un modello di espressione regolare da parte dell'utente che è usato da preg_match(). Come posso verificare che il modello sia valido?Come posso rilevare un modello preg_match non valido?
risposta
Basta testarlo. preg_match()
restituirà FALSE
se il modello non è valido.
Valori di ritorno: preg_match() restituisce il numero di volte che il modello corrisponde. Quello sarà o 0 volte (nessuna corrispondenza) o 1 volta perché preg_match() sarà interromperà la ricerca dopo la prima corrispondenza. preg_match_all() al contrario sarà continuare fino alla fine del soggetto . preg_match() restituisce FALSE se si è verificato un errore.
Secondo la docs,
preg_match() restituisce FALSE se si verifica un errore.
il problema è che verrà anche generato un avviso.
Un modo per gestire questo è eliminare l'output del messaggio di errore, rilevare il valore restituito e emettere l'errore utilizzando error_get_last()
se era falso.
Qualcosa di simile
$old_error = error_reporting(0); // Turn off error reporting
$match = preg_match(......);
if ($match === false)
{
$error = error_get_last();
echo $error["message"];
}
error_reporting($old_error); // Set error reporting to old level
Potrebbe non essere necessario l'errore di segnalazione bit in un ambiente di produzione - dipende dalla configurazione.
if (preg_match($regex, $variable)) {
echo 'Valid';
}
else {
echo 'InValid';
}
È necessario utilizzare preg_match (...)! == false per controllarlo perché può restituire 0 se è valido ma non lo fa non corrisponde a – mck89
Si dovrebbe comparare a FALSE: 'if (preg_match ($ regex, $ variabile)! == FALSE) {'. Il modello può essere valido, senza corrispondenze. Vedi [docs] (http://nl2.php.net/manual/en/function.preg-match.php) – Lekensteyn
È possibile utilizzare preg_last_error() per ottenere risposte. pagina di dettaglio:
http://php.net/manual/en/function.preg-last-error.php
Grazie!
Non utilizzare @, utilizzare la barra rovesciata davanti a preg_match
per generare l'eccezione nelle versioni più recenti di PHP (5.3+?).
tr{
if (\preg_match($regex, $variable)===false)
echo 'Valid';
else
echo 'InValid';
}
catch(Exception $e) {
echo $e->getMessage(); die;
}
Il backslash si riferisce solo al namespace globale. Altrimenti non fa nulla, nemmeno cambia il comportamento dell'errore. –
+1 Per menzionare la soppressione dell'output del messaggio di errore. – Gumbo
Sai, non è vietato usare '@': p – Artefacto
Dovrebbe essere 'if ($ corrisponde === falso)' – webbiedave