2012-01-14 11 views
17

tengo el siguiente código de trabajo:Advertencia: preg_match(): pcre_fullinfo interna()

$test = '123456'; 

$int = preg_match('/^\d+$/', $test, $matches); 

print_r(array($int, $matches)); 

Sin embargo cuando execute it on codepad me sale el error:

Warning: preg_match(): Internal pcre_fullinfo() error -3 on line 5

Sin embargo, el código se ejecuta en mi propia máquina (y el código debe estar bien en mi humilde opinión).

Necesito distribuir mi código en el futuro, por lo que sería malo si se rompe según algunas configuraciones. Entonces, ¿cuál es la razón por la que el teclado de códigos se rompe?

Respuesta

29

Código ejecutado a través de la pantalla de códigos se está ejecutando en un entorno muy restringido:

Code execution is handled by a supervisor based on geordi. The strategy is to run everything under ptrace, with many system calls disallowed or ignored. Compilers and final executables are both executed in a chroot jail, with strict resource limits. The supervisor is written in Haskell.

Aunque no es nada que cabría esperar para romper un motor de expresiones regulares es muy posible que la biblioteca pcre utiliza algo internamente que está bloqueado por la entorno del teclado Ningún sistema de producción utiliza tales restricciones severas, por lo que debe tener la seguridad de usar ese código en su aplicación.

El código de error significa "PCRE_ERROR_BADOPTION - el valor de que no es válido". Sin embargo, el código en la fuente de PHP donde se produce el error es rc = pcre_fullinfo(pce->re, extra, PCRE_INFO_CAPTURECOUNT, &num_subpats); que utiliza una constante para . Entonces, claramente significa que la biblioteca pcre está rota en el teclado.

Si quiere estar completamente seguro, puede escribir un pequeño programa en C usando libpcre para llamar a esa función en la misma expresión regular.