Quando si avere segnalazioni di errori su, non si può farla franca semplicemente testando il risultato booleano. Se la regex fallisce vengono lanciati degli avvisi (ad esempio: "Nessun delimitatore finale trovato xxx")
Ciò che trovo strano è che la documentazione di PHP non dice nulla di questi avvisi lanciati.
Di seguito è la mia soluzione per questo problema, utilizzando try, catch.
//Enable all errors to be reported. E_WARNING is what we must catch, but I like to have all errors reported, always.
error_reporting(E_ALL);
ini_set('display_errors', 1);
//My error handler for handling exceptions.
set_error_handler(function($severity, $message, $file, $line)
{
if(!(error_reporting() & $severity))
{
return;
}
throw new ErrorException($message, $severity, $severity, $file, $line);
});
//Very long function name for example purpose.
function checkRegexOkWithoutNoticesOrExceptions($test)
{
try
{
preg_match($test, '');
return true;
}
catch(Exception $e)
{
return false;
}
}
Giusto per sottolineare, questo è rigorosamente ('===') Booleano 'falso', non un valore falsy (' == ') come' 0'. – Wiseguy
Sembra funzionare. Ho pensato che preg_ * avrebbe restituito false se non corrispondesse all'espressione, dando quindi falsi positivi. – CrazeD
@CrazeD A seconda della funzione chiamata e dell'opzione passata potrebbe essere una varietà di valori. Per quanto sopra se '$ subject' non corrisponde a' $ pattern', ed era valido, restituirà '0'. Tuttavia, 'preg_replace' restituirà' NULL' in caso di errore invece che falso. Dovrai solo guardare i documenti per la particolare funzione che stai usando. – cspray