2010-09-14 8 views

Respuesta

5

Solo pruébalo. preg_match() devolverá FALSE si el patrón no es válido.

Valores devueltos: preg_match() devuelve el número de veces que coincide el patrón. Eso será 0 veces (sin coincidencia) o 1 vez porque preg_match() hará dejar de buscar después de la primera coincidencia. preg_match_all() por el contrario continuará hasta que llegue al final del asunto . preg_match() devuelve FALSE si ha ocurrido un error.

8

Según la docs,

preg_match() devuelve FALSE si se produjo un error.

el problema es que también lanzará una advertencia.

Una forma de resolver esto es suprimir la salida del mensaje de error, capturar el valor de retorno y generar el error usando error_get_last() si es falso.

Algo así como

$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 

Es posible que no necesite el informe de bits de error en un entorno de producción - que depende de su configuración.

+0

+1 Por mencionar la supresión de la salida del mensaje de error. – Gumbo

+1

Ya sabes, no está prohibido usar '@': p – Artefacto

+0

Debería ser 'if ($ match === false)' – webbiedave

0
if (preg_match($regex, $variable)) { 
    echo 'Valid'; 
} 
else { 
    echo 'InValid'; 
} 
+1

Debe usar preg_match (...)! == falso para verificarlo porque puede devolver 0 si es válido pero no lo hace no coincide – mck89

+0

Debería estar comparando con FALSE: 'if (preg_match ($ regex, $ variable)! == FALSE) {'. El patrón puede ser válido, sin coincidencias. Consulte [docs] (http://nl2.php.net/manual/en/function.preg-match.php) – Lekensteyn

0

Pensé que había visto un método para esto en MRE; resulta que fue uno que Friedl escribió él mismo. Aquí está el listing.

-1

No utilice @, use una barra hacia atrás delante de preg_match para arrojar la excepción en las versiones más nuevas de PHP (5.3+?).

tr{ 
    if (\preg_match($regex, $variable)===false) 
     echo 'Valid'; 
    else 
     echo 'InValid'; 
} 
catch(Exception $e) { 
    echo $e->getMessage(); die; 
} 
+0

La barra diagonal inversa solo hace referencia al espacio de nombres global. De lo contrario, no hace nada, ni siquiera cambia el comportamiento del error. –

Cuestiones relacionadas