Php Expresiones Regulares
Enviado por bobolino • 5 de Octubre de 2012 • 522 Palabras (3 Páginas) • 467 Visitas
¿PHP Puro o RegExps?
Por Omar G. Soto Fortuño
Tabla de contenido:
1. Introducción
2. Ejemplo usando PHP Puro
3. Ejemplo usando RegExps
4. Prueba de rendimiento
5. Conclusión
1. Introducción
En este manual intentare mostrarles lo lentas que son las RegExps; las regexps son muy útiles, las uso mucho pero siempre es bueno saber sus defectos y este es su lentitud por lo tanto intentare demostrarles con php puro (sin regexps) lo lento que van las regexps. En este FAQ mostrare el ejemplo de un script que tapa las ips, por ejemplo, esta es la IP sin proteger: 234.23.12.57, y esta la IP protegida por el script: 234.23.**.**. Espero que sea de su interés. (Las regexps economizan mucha mas memoria)
2. Ejemplo usando PHP Puro
Codigo PHP:
function protect_ip1($ip) { $ip2long = ip2long($ip); if ($ip2long == -1 || $ip2long === FALSE) { return false; } else { $part = explode('.', $ip); foreach($part as $key=>$num) { if($key >= 2) { $part[$key] = str_repeat('*', strlen($num)); } } return implode('.', $part); } }
Como podemos ver en este código tenemos una función llamada protect_ip1 que se encarga de tapar la IP usando PHP Puro (sin regexps). En una prueba de rendimiento (al final pondré el código) este código se tardo 3 segundos en ejecutarse 100,000 veces. (Este código uso 1272bytes de la memoria)
3. Ejemplo usando RegExps
Código PHP:
function protect_ip2($ip) { $ip2long = ip2long($ip); if ($ip2long == -1 || $ip2long === FALSE) { return false; } else { return preg_replace('/([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})/sie', "'\\1.\\2.' . str_repeat('*', strlen('\\3')) . '.' . str_repeat('*', strlen('\\4'))", $ip); } }
En este código ya se ve todo mas lindo, con regexps. Únicamente que en esta función hago 2 cosas, verificar que la IP sea valida y ejecutar el preg_replace. Sin embargo esta función es mucho más lenta que la de PHP Puro ya que la prueba de rendimiento refleja que ejecutando este código 100,000 veces tarda 3 segundos mas que la de PHP Puro ósea 4 segundos. (Este código uso 408bytes de la memoria)
4. Prueba de rendimiento
Código PHP:
$mem = memory_get_usage(); $comienzo = time(); for($i = 0; $i < 100000; $i++) { protect_ip1('234.23.12.57'); } echo time() - $comienzo . 'segs - PHP Puro<br />'; echo memory_get_usage() - $mem . 'bytes - PHP Puro<br /><br />'; $mem = memory_get_usage(); $comienzo = time(); for($i = 0; $i < 100000; $i++) { protect_ip2('234.23.12.57'); } echo time() - $comienzo . 'segs - RegExps<br />'; echo memory_get_usage() - $mem . 'bytes - RegExps<br /><br />';
Este código lo que haces es simplemente coger
...