php - una - expresion regular espacio en blanco
Probar si una cadena es expresiones regulares (4)
¿Hay una buena manera de probar si una cadena es una expresión regular o una cadena normal en PHP?
Lo ideal es escribir una función para ejecutar una cadena, que devuelva verdadero o falso.
preg_last_error()
un vistazo a preg_last_error()
:
<?php
preg_match(''/[a-z]/'', ''test'');
var_dump(preg_last_error());
preg_match(''invalid regex'', ''test'');
var_dump(preg_last_error());
?>
Donde obviamente el primero no es un error, y el segundo sí lo es. Pero preg_last_error()
devuelve int 0
ambas ocasiones.
¿Algunas ideas?
¿Por qué no usar simplemente ... otra expresión regular? Tres líneas, no @
kludges ni nada:
// Test this string
$str = "/^[A-Za-z ]+$/";
// Compare it to a regex pattern that simulates any regex
$regex = "/^//[/s/S]+//$/";
// Will it blend?
echo (preg_match($regex, $str) ? "TRUE" : "FALSE");
O, en forma de función, aún más bonita:
public static function isRegex($str0) {
$regex = "/^//[/s/S]+//$/";
return preg_match($regex, $str0);
}
Esto no prueba la validez; pero parece que la pregunta es Is there a good way of test if a string is a regex or normal string in PHP?
y lo hace
Aquí hay una buena respuesta de cómo:
https://.com/a/12941133/2519073
if(@preg_match($yourPattern, null) === false){
//pattern is broken
}else{
//pattern is real
}
La única manera fácil de probar si una expresión regular es válida en PHP es usarla y verificar si se emite una advertencia.
ini_set(''track_errors'', ''on'');
$php_errormsg = '''';
@preg_match(''/[blah/'', '''');
if($php_errormsg) echo ''regex is invalid'';
Sin embargo, usar una entrada de usuario arbitraria como una expresión regular es una mala idea . Antes había agujeros de seguridad (desbordamiento de búfer => ejecución remota de código) en el motor de PCRE y podría ser posible crear expresiones regulares largas especialmente diseñadas que requieren mucha CPU / memoria para compilar / ejecutar.
La forma más sencilla de probar si una cadena es una expresión regular es:
if( preg_match("/^//.+//[a-z]*$/i",$regex))
Esto le dirá si una cadena tiene una buena probabilidad de ser una expresión regular. Sin embargo, hay muchas cadenas que pasarían esa verificación pero no serían una expresión regular. Las barras no escapadas en el medio, los modificadores desconocidos al final, los paréntesis no coincidentes, etc. podrían causar problemas.
La razón por la que preg_last_error
devolvió 0 es porque la "expresión regular no válida" no es:
- PREG_INTERNAL_ERROR (un error interno)
- PREG_BACKTRACK_LIMIT_ERROR (forzando excesivamente el retroceso)
- PREG_RECURSION_LIMIT_ERROR (excesivamente recurrente)
- PREG_BAD_UTF8_ERROR (UTF-8 con formato incorrecto)
- PREG_BAD_UTF8_OFFSET_ERROR (desplazamiento hacia la mitad de un carácter UTF-8)