Publicado por Juan Pablo el 20.Jun.2006 | Comentarios (6)
Me gustan mucho las expresiones regulares, pero no me considero experto; algunas expresiones son tan caprichosas que incluso pueden quitarte varias horas o días en resolver y lograr así una expresión lo más depurada posible.
Usando la función preg_match_all
podemos evaluar una cadena de acuerdo a una expresión regular y guardar sus coincidencias en una matriz.
Por ejemplo: hoy me ha tocado separar una fecha que está de la forma aaaammdd; año, mes, día. Para separarla y manipularla usaremos una expresión regular, vamos ahí:
$n = 19870317;
preg_match_all("/(\d{4})(\d{2})(\d{2})/",$n,$c);
echo $c[1][0]."\n".$c[2][0]."\n".$c[3][0];
Donde:
()
: Meta-caracter de Inicio y Fin del subpatrón de búsqueda, en este caso 3 subpatrones.\d
: Tipo genérido de caracter que es un dígito, la barra invertida quiere decir que es escapado, de no ser escapado no tendría ningún efecto, sólo sería una "d".{4}
: Es otro meta-caracter, un cuantificador de inicio ({
), el valor mínimo y el cuantificador final (}
). Todo lo cual quiere decir que se buscará un mínimo de 4 valores.Por supuesto puedes depurar tus resultados con un:
print_r($c);
Más información en : Sintaxis de los Patrones de expresiones regulares compatibles con Perl
Bonus: Ya que estamos en el tema, el mismo efecto pero usando Vim sería:
:s/\(\d\{4\}\)\(\d\{2\}\)/\1 \2 /g
Enlace Permanente, Comentarios (6), Publicada en: Código | PHP
Juque:
Me extraña que uses eso, hay una forma mas facil con substr
?PHP
$n = 19870317;
$anio = substr($n, 0,3); $mes = substr($n, 3,5); $dia = substr($n, 5,7);
printf('Estamos a ' . $dia . ' del ' . $mes . ' del ' . $anio);
?>
jejeje, ¿realmente crees que es mejor?, míralo una vez más. Una función, dos variables.
Una buena forma de comparar sería que ver cual de las dos técnicas ocupa más recursos del sistema (procesador y memoria) y cual toma menos tiempo para obtener el mismo resultado.
mmm.......... que feo..jejejej ¡¡ xD
mejor dejemoslo asi:
$n = 19870317;
echo strftime("%d-%m-%Y",strtotime($n));
@ricardo
La mejor forma es la que sea mas legible, menos obscura y que utilize las funciones que el lenguaje tiene para manejar fechas :)
@0x01
Tu forma tambien sirve, aunque mejor usa las funciones de tiempo que tiene PHP
@juan pablo
Defintivamente no compartimos el gusto por las expresiones regulares, las encuentro a menudo en codigo de otras personas las usan para tareas muy triviales que no las requieren como este ejemplo, siempre las macheteo con mi hacha de bolsillo :) me hacen el codigo menos comprensible...
Igual es bueno que publiques estos ejemplos cortos.. para discutir un rato. ;-)
Yo voto por la expresion regular, es la manera directa de formatear texto. internamente esas funciones como por ejemplo substr, hace una busqueda mediante expresiones regulares.