Verifica se un'espressione regolare è valida in PHP

Sto scrivendo una class di validation dei moduli e desidero includere espressioni regolari nella validation. Pertanto, la regex fornita non è garantita per essere valida.

Come posso (in modo efficiente) verificare che la regex sia valida?

Usa lo schema nelle tue preg_* chiamate. Se la function restituisce false , è probabile che ci sia un problema con il tuo pattern. Per quanto ne so questo è il modo più semplice per verificare se un model regex è valido in PHP.


Ecco un esempio che specifica il giusto tipo di controllo boolean:

 $invalidPattern = 'i am not valid regex'; $subject = 'This is some text I am searching in'; if (@preg_match($invalidPattern, $subject) === false) { // the regex failed and is likely invalid } 

Quando hai segnalato errori, non puoi farla franca semplicemente testando il risultato boolean. Se la regex fallisce vengono lanciati degli avvisi (ad es. 'Warning: Nessun delimitatore finale trovato xxx').

Quello che trovo strano è che la documentazione di PHP non dice nulla su 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; } } 

Non dovresti usare @ per silenziare tutti gli errori perché anche gli errori fatali vengono silenti.

 function isRegularExpression($string) { set_error_handler(function() {}, E_WARNING); $isRegularExpression = preg_match($string, "") !== FALSE; restore_error_handler(); return isRegularExpression; } 

Questo disabilita solo gli avvisi per la chiamata preg_match.

Questa è la mia soluzione usando l'avviso imminente se qualcosa non va nell'espressione:

 function isRegEx($test) { $notThisLine = error_get_last(); $notThisLine = isset($notThisLine['line']) ? $notThisLine['line'] + 0 : 0; while (($lines = rand(1, 100)) == $notThisLine); eval( str_repeat("\n", $lines) . '@preg_match(\'' . addslashes($test) . '\', \'\');' ); $check = error_get_last(); $check = isset($check['line']) ? $check['line'] + 0 : 0; return $check == $notThisLine; }