Cuando tiene informes de errores, no puede salirse con la suya simplemente probando el resultado booleano. Si la expresión regular falla, se emiten advertencias (es decir, 'Advertencia: no se ha encontrado el delimitador final xxx'.)
Lo que me parece extraño, es que la documentación de PHP no dice nada acerca de estas advertencias arrojadas.
Debajo está mi solución para este problema, usando 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;
}
}
Solo para enfatizar, eso es estrictamente ('===') Booleano 'falso', no un valor de falsy (' == ') como' 0'. – Wiseguy
Eso parece funcionar. Pensé que el preg_ * devolvería falso si no coincidía con la expresión, dando falsos positivos. – CrazeD
@CrazeD Dependiendo de la función llamada y de la opción aprobada, podría tratarse de una variedad de valores. Para lo anterior, si '$ subject' no coincide con' $ pattern', y fue válido, devolverá '0'. Sin embargo, 'preg_replace' devolverá' NULL' en caso de falla en lugar de falsa. Simplemente tendrá que mirar los documentos para la función particular que está utilizando. – cspray