martes, 28 de abril de 2015

RegExp en PHP

0 comentarios
Fuente de referencia

Autor: Daniel Obando.

Las expresiones regulares en PHP son una potente herramienta de programación que muchas veces se deja de lado ya que se cree que es muy compleja (aunque sí lo puede ser). En este post explicamos de manera sencilla cómo utilizar las expresiones regulares en PHP y brindamos soluciones a ejercicios cotidianos de programación utilizando expresiones regulares. También puede servir como un pequeño recordatorio.

La única salvedad que debemos hacer es que se debe considerar muy bien cuando usar una expresión regular, y no usarlas en exceso. Esto ya que el procesamiento de una expresión regular es considerablemente más costoso que una simple búsqueda de strings (utilizando strstr por ejemplo).

La idea, entonces, de una expresion regular es crear un string especial para hacer una búsqueda en otro string. Si nuestra expresión regular encaja (hace “match”) en el string, la operación es exitosa. Exsite algunos caracteres que tienen un significado especial en una expresión regular:

Metacaracteres
. Match con cualquier caracter
^ Match al principio del string
$ Match al final del string
\s Match con cualquier espacio en blanco
\d Match con cualquier dígito
\D Match con cualquier caracter que no sea un dígito
\w Match con cualquier caracter que pueda ser parte de una palabra (letra, número, guión bajo)
\W Match con cualquier caracter que NO pueda ser parte de una palabra (letra, número, guión bajo)
\A Inicio de un string.
\z Final de un string.

Cuantificadores
* el caracter puede aparecer cero o mas veces.
+ el caracter puede aparecer una o mas veces.
? el caracter puede aparecer cero o una vez.
{n} el caracter aparece exactamente n veces.
{n,} el caracter aparece n o más veces.
{n,m} el caracter puede aparecer entre n y m veces.
Como parte de la notacion, siempre encerramos las expresiones regulares entre /, llaves ({}) o #. Por ejemplo, la expresion /ab?c/ hace match con ac y abc. La expresión regular /ab{1,3}c/ hace match con abc, abbcy abbbc.

Agrupadores
[] permiten agrupar creando rangos, por ejemplo /ab[0-5]+c/ hará match con cualquier string que contenga ab, una o más veces un número entre 0 y 5, y finalmente una c. Por ejemplo: ab12c.
() Nos permiten crear sub-expresiones, expresiones regulares contenidas dentro de otras: /a(bc.)+e/. Tiene un uso especial en formas como (…), que permite capturar todo lo que encierren los paréntesis, y (a|b) que hace match con a o b

Modificadores
Permiten cambiar el modo en que se ejecute la expresión regular. Se agregan después del delimitador de cierre.
i Coincidir indistintamente entre mayúsculas y minúsculas.
m Match multilínea.
s El metacaracter . hará match también con el caracter de cambio de línea.
u Hacer los matches en modo UTF8
x Ignorar espacios.
Otros modificadores: X,e,A,D,S,U,J ver más

Funciones PHP

preg_match
Nos permite evaluar si un string hace match con una expresi&ocuate;n regular. Por ejemplo, para validar un email haríamos lo siguiente:

function verificar_email($email) 
{
  if(preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/",$email))
  {
    return true;
  }
  return false;
}

Otros ejemplos interesantes pueden ser:
//1. verificar si un password es seguro 
function verificar_password_strenght($password) 
{   
   if (preg_match("/^.*(?=.{8,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$/", $password))     
     echo "Su password es seguro.";   
   else     
     echo "Su password no es seguro."; 
} 

//2. Verificar el fomato de una IPv4
function verificar_ip($ip)
{
    return preg_match("/^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])" . "(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/", $ip );
}

//3. Verificar formato de número telefónico en EU
function verificar_telefono_eu($telefono)
{
  $regex = '/^(?:1(?:[. -])?)?(?:\((?=\d{3}\)))?([2-9]\d{2})'.'(?:(?$0', $text);
}

Al usar preg_replace se vuelve muy útil utilizar las retroreferencias. Estas son simplemente una sintaxis para hacer referencia a los matches que ocurrirán al ejecutar una expresión regular. Por ejemplo, para convertir una fecha en formato MM/DD/YYYY a formato DD/MM/YYYY podemos utilizar retroreferencias:
 
function cambiar_formato_fecha($fecha)
{
    return preg_replace("/([0-9]{4})\/([0-9]{2})\/([0-9]{2})/i","$3/$2/$1",$fecha);
}

Para un guía completa puede visitar el manual de PHP.
Read more ►

martes, 14 de abril de 2015

Python: Imprimir resultados en horizontal en lugar del predeterminado vertical

8 comentarios
Haciendo un poco de malabares con python se me presentó la oportunidad de hacer un script que hiciera ciertas modificaciones a las líneas escritas en dos idiomas, y para analizar las palabras y hacer su respectivo pareo hice uso de ciclos FOR, pero las palabras se mostraban de forma vertical, es decir que cuando hacía esto:

for i in range(10): print i


Me mostraba esto:

0
1
2
3
4
5
6
7
8
9

Y lo que necesitaba es que lo mostrara así:

0 1 2 3 4 5 6 7 8 9 

Para mostrar un resultado de forma horizontal hay que agregar una 'comma' ( , ) en la sentencia (función en 3.x) print, y en las dos ramas en que se divide python se puede hacer de esta forma:

En python 2.x:
for x in range(10): print x,


En python 3.x:
for x in range(10): print(x,end=' ')


Al estar trabajando con python 2.7.4, parte del script me quedó de esta forma:

for i in range(10): print i,


0 1 2 3 4 5 6 7 8 9


Quiero mencionar que la sintaxis del ciclo FOR que he utilizado es válida sólo cuando las instrucciones a realizar dentro del ciclo/bucle se tratan de una sola línea, como la del ejemplo, para actividades complejas que conlleven más de una línea se debe utilizar la identación tradicional (pero no obligatoria) de 4 espacios, sino va a mostrar un error que la identación no es correcta:
IndentationError: unindent does not match any outer indentation level.

Espero que esta ayuda en español pueda ser de utilidad a alguien más. La ayuda que encontré en inglés se encuentra en este enlace.

Bytes.
Read more ►
 

Copyright © El igloo de Tux Design by O Pregador | Blogger Theme by Blogger Template de luxo | Powered by Blogger