2012-05-17 15 views
6

No soy bueno con la expresión regular, por lo que ni siquiera saben lo que hace éste, exactamente:preg_match falla en php> 5,3

echo preg_match('/^(([a-zA-Z0-9\x2d]{1,63}\x2e)*[a-zA-Z0-9\x2d]{1,63}){1,254}$/', 'example12345678.com>'); 

la aparté de una versión anterior de Zend Framework - 1.5, que está desactualizado y en la última versión estable del framework esta expresión regular ya no se presenta. Sin embargo, su comportamiento es curioso, porque no encontré ninguna explicación documentada o una nota de incompatibilidad hacia atrás en los recursos oficiales de php.

El caso es que en PHP 5.2 * que funciona bien:. Devuelve 0. En caso de PHP 5.3.10, 5.4.0 devuelve FALSE, lo que significa "un error (lo más probable 5.3, 5.4 supongo.). ".

Mi pregunta es: ¿por qué? y cual es el error? ¿Es la expresión regular, algún tipo de recurrencia o ambigüedad de reglas? ¿Por qué funciona en php 5.2 si es así?


Curiosamente, si cambio 'example12345678.com>' a 'example1234567.com>' (lo que es uno más corto o más carbón) - que empiece a funcionar y devuelve 0. Si lo cambio a '123123123123123123123123123 'funciona también y devuelve 1.

UPD: no se sabe aún si esto es importante, pero aquí están las versiones pcre 8,02 (PHP 5.2) vs 8,12 (php 5,3)


UPD2: Entiendo para qué sirve ... más o menos ... y no hay ningún problema para que nada funcione en este momento. Como dije, una actualización de Zend_Validate_ * lo resuelve. Trataré de describir mi preocupación en otras palabras:

decir, actualizo una pieza importante de software, haciendo que php5.2> php5.3 cambie. Intento encontrar información sobre todos los problemas que podría enfrentar (principalmente al leer esto: http://php.net/manual/en/migration53.php). El software es un poco antiguo, pero no es antiguo, p. Zend Framework podría ser de la versión 1.5. Compruebo/parcheo/analizo y corrijo cada ruptura de bc y la característica obsoleta. Incluso las pruebas de mi unidad funcionan bien.

Para mi sorpresa, lo que se describe en la pregunta sucede. (Para ser precisos, Zend_Validate_Hostname arroja una excepción). Así que ahora quiero saber por qué me perdí esta al actualizar y, lo que es más importante, si debería volver a verificar todas las 'preg_match' (y otras funciones de PCRE que utilizan) en la aplicación probando varios datos de entrada imaginables para intentar encontrar "correcciones de errores" similares ".

Si se trata de una "corrección de errores". Porque parece una nueva falla: solía funcionar como se esperaba en php5.2 y ya no funciona.

Esperaba obtener algunas pistas para reducir la búsqueda.

+1

¿Cómo lo estás usando, si usted no sabe lo que hace ¿Exactamente? – ilanco

+0

¿Y de qué archivo lo tomó? –

+0

@ilanco, lo estoy usando como parte del marco. esto es sintopico sin embargo. – lcf

Respuesta

2

Esa es una expresión regular fea. El problema es que hay demasiadas formas en que la cadena podría coincidir con, por lo que el motor se está quedando sin memoria probándolas todas antes de darse cuenta de que en realidad no coinciden.

Además, parece que intenta hacer coincidir nombres de dominio válidos, y no es así.Me gustaría sustituir a la llamada a preg_match con una llamada a esta función en lugar:

function is_valid_domain_name($string) { 
    if (strlen($string) > 253) { 
     return false; 
    } 
    $label = '(?!-)[a-zA-Z0-9-]{0,63}(?<!-)'; 
    return preg_match("/^(?:$label\.){0,126}$label$/", $string); 
} 

Falla rápidamente en su cadena de problema:

echo is_valid_domain_name('example12345678.com>'),"\n"; 
+0

Esto es feo de hecho. Como la mayoría de las otras expresiones regulares. :) Gracias por tu respuesta Mark. El problema con esta expresión regular en particular se resolvió, sin embargo. Lo que pregunté fue: ¿por qué funcionó con php5.2? Actualicé mi pregunta con algunos detalles. – lcf

+0

Nunca vas a ver todo en una actualización, sin importar cuán cuidadoso seas. Si se hubiera sometido a una prueba que causó este problema, genial, pero no lo hizo. Solo tienes que estar listo para iterar y arreglar lo que encuentres roto después. Supongo que hubo un cambio en el motor de pcre que estableció una restricción más estricta (o tal vez solo una restricción donde no había previamente) para tratar de evitar problemas de recursión infinita. –

+0

Tienes razón, no puedo ver todo. Pero puedo tratar de atrapar tanto como sea posible. Y esas cosas que capto deben tener una explicación, algo real, no solo "oh, suspiro, mala suerte, qué vas a hacer". Si se trata de un error, podría informarlo, si esta es una característica, podríamos agregarlo a la lista de incompatibilidades inversas. – lcf

Cuestiones relacionadas