martes, 29 de julio de 2014

Procesamiento de las cadenas de caracteres en PHP - 2 de 2



2. Las expresiones regulares

Las expresiones regulares permiten realizar búsquedas o sustituciones muy complejas en una cadena de caracteres.

Por ejemplo, si quiere saber si un correo electrónico contiene el carácter @ y el carácter . o si quiere cambiar el formato de una fecha del inglés al español, el uso de expresiones regulares permiten hacerlo en un solo registro.

En este soporte, utilizaremos PCRE (Perl-Compatible Regular Expression), que usa las funciones de expresiones regulares más rápidas. También disponemos de POSIX (Portable Operating System Interface), donde las funciones comienzan por ereg, pero hoy en día están obsoletas. La codificación debe hacerse en ANSI en Notepad++, para que los siguientes ejemplos funcionen correctamente.
  • La función preg_match() devuelve verdad si el valor que se busca está en la cadena de caracteres.

Por ejemplo:

<?php
if (preg_match("/web/","El webdesigner crea un sitio web.")) {
echo "Se ha encontrado la cadena web.";
}
else {
echo "La cadena Web no se ha encontrado.";
}
?>

Da como resultado:

La cadena Web se ha encontrado.

Por tanto, su sintaxis es:

$existe = preg_match ($pattern,$cadena);

con $existe de tipo booleano.

$pattern es una cadena que indica a la función preg_match()cómo debe realizar la búsqueda. Esta cadena empieza y termina con un delimitador que suele ser el símbolo /. Aunque también podrá ver el símbolo #.

En el siguiente ejemplo, la función preg_match()comprueba si la cadena "El webdesigner crea un sitio Web." contiene la cadena "Web".

Esta función tiene en cuenta las mayúsculas y las minúsculas.

Por ejemplo:

<?php
if (preg_match("/WEB/","El webdesigner crea un sitio Web.")) {
echo "La cadena Web se ha encontrado.";
}
else {
echo "La cadena Web no se ha encontrado.";
}
?>

Da como resultado:

La cadena Web no se ha encontrado.

Porque la palabra WEB es distinta de Web.
  • La función preg_replace() sustituye el contenido por otro que pasa en argumento. Esta función devuelve la cadena de caracteres transformada.

Por tanto su sintaxis es:

$cadena_transformada =
preg_replace($pattern,$cadena_para_sustituir,$cadena original);
  • a. Las mayúsculas y las minúsculas

Si no quiere tener en cuenta las mayúsculas y las minúsculas, solo tiene que agregar i después del último /.

Por ejemplo:

<?php
if (preg_match("/WEB/i","El webdesigner crea un sitio Web.")) {
echo "La cadena Web se ha encontrado.";
}
else {
echo "La cadena Web no se ha encontrado.";
}
?>

Da como resultado:

La cadena Web se ha encontrado.

Como puede observar, la búsqueda se realiza gracias al patrón de búsqueda (pattern). Puede agregarle muchas otras opciones. Vamos a ver las más utilizadas.
  • b. Búsqueda de una palabra, y no una cadena

Hasta ahora, la búsqueda de la cadena de caracteres se realiza en una frase. Por ejemplo, si busca la cadena "designer":

<?php
if (preg_match("/designer/","El webdesigner crea un sitio Web."))
{
echo "La cadena designer se ha encontrado.";
}
else {
echo "La cadena designer no se ha encontrado.";
}
?>

Da como resultado:

La cadena designer se ha encontrado.

Pero si busca solamente la palabra aquellas palabras que comienzan con "designer", debe agregar \b delante de la palabra del patrón de búsqueda.

Por ejemplo:

<?php
if (preg_match("/\bdesigner/","El webdesigner crea un sitio Web."))
{
echo "La palabra designer se ha encontrado.";
}
else {
echo "La palabra designer no se ha encontrado.";
}
?>

Da como resultado:

La palabra designer no se ha encontrado.

En efecto: designer forma parte de la palabra webdesigner, pero no es una palabra propiamente dicha.

Por el contrario, si escribe:

<?php
if (preg_match("/\bweb/","El webdesigner crea un sitio Web."))
{
echo "la palabra Web se ha encontrado.";
}
else {
echo "La palabra Web no se ha encontrado.";
}
?>

Da como resultado:

La palabra Web se ha encontrado.

Si desea encontrar una palabra aislada, es suficiente con incluirla dentro de \b.

Por ejemplo:

<?php
if (preg_match("/\bsite\b/","El diseñaor web diseña un sitio web."))
{
echo "Se ha encontrado la palabra sitio.";
}
else
echo "No se ha encontrado la palabra sitio.";
}
?>

Muestra:

Se ha encontrado la palabra sitio.

  • c. El símbolo O

Este símbolo es | , y permite buscar una cadena u otra.

Por ejemplo:

<?php
if (preg_match("/webdesigner|grafista/","El webdesigner crea
un sitio Web.")) {
echo "La cadena webdesigner o la cadena grafista
se ha encontrado.";
}
else {
echo "La cadena webdesigner o la cadena grafista
no se ha encontrado.";
}
?>

Da como resultado:

La cadena webdesigner o la cadena grafista se ha encontrado.
La cadena "grafista" no existe, pero la cadena "webdesigner" sí.

  • d. Comienzo de la cadena

Este símbolo es ˆ y permite buscar una cadena empezando por una palabra.

Por ejemplo:

<?php
if (preg_match("/ˆEl/","El webdesigner crea un sitio Web.")) {
echo "La cadena comienza con la palabra ’El’.";
}
else {
echo "La cadena no comienza con la palabra ’El’.";
}
?>

Da como resultado:

La cadena comienza con la palabra ’El’.

  • e. Fin de cadena

Este símbolo es $, y permite buscar una cadena que termina con una palabra.

Por ejemplo:

<?php
if (preg_match("/web.$/","El webdesigner crea un sitio Web.")) {
echo "La cadena termina con la palabra ’Web.’.";
}
else {
echo "La cadena no termina con la palabra ’Web.’.";
}
?>

Da como resultado:

La cadena termina con la palabra ’Web.’.

  • f. Un carácter en una clase

Una clase permite definir un conjunto de caracteres que están en una cadena. Su sintaxis es [...], con los caracteres dentro de los corchetes.

Por ejemplo:

<?php
if (preg_match("/b[oi]n/","de otra manera este sitio Web es bonito.")) {
echo "La cadena contiene la cadena bon o bin.";
}
else {
echo "La cadena no contiene la cadena bon o bin.";
}
?>

Da como resultado:

La cadena contiene la cadena bon o bin.

La expresión regular es verdadera si contiene la cadena "bon" o la cadena "bin".

Si escribe: preg_match("/b[aieu]n/",(cadena de caracteres))" entonces la expresión regular sería verdadera si contiene la palabra "ban" o "bin" o "ben" o "bun".

Por ejemplo:

<?php
if (preg_match("/b[aou]n$/","de otra manera este sitio Web es bonito."))
{
echo "La cadena termina con la palabra ban o bon o bun.";
}
else {
echo "La cadena no termina con la palabra ban o bon o bun.";
}
?>

Da como resultado:

La cadena no termina con la palabra ban o bon o bun.

De este modo, se ha añadido un carácter $ al final de la expresión regular y por tanto la cadena debe terminar con las palabras ban, bon o bun.

  • g. Rango de caracteres en una clase

Resulta muy tedioso escribir todas las letras del alfabeto y los dígitos del 0 al 9 en una clase. Afortunadamente, el símbolo - (guión), permite definir un rango de caracteres o números.

Por ejemplo:

<?php
if (preg_match("/p[a-z]e/","En el puerto de Amsterdam.")) {
echo "La cadena contiene la cadena pue.";
}
else {
echo "La cadena no contiene la cadena pue.";
}
?>

Da como resultado:

La cadena contiene la cadena pue.

La expresión regular es verdadera si la cadena contiene otra cadena que comienza con p, seguida de cualquier otra letra del alfabeto y después una e. Por tanto, la palabra "puerto" encaja bien en este supuesto.

Otro ejemplo:

<?php
if (preg_match("/ [0-9]/","Esta fruta cuesta 10 euros.")) {
echo "La cadena contiene un espacio y una cifra entre 0 y 9.";
}
else {
echo "La cadena no contiene un espacio y una cifra entre 0 y 9.";
}
?>

Da como resultado:

La cadena contiene un espacio y una cifra entre 0 y 9.

La expresión regular es verdadera si la cadena contiene un espacio seguido de una cifra entre 0 y 9. Como la cadena contiene el número 10 precedido de un espacio, cumple la expresión regular.

  • h. La no presencia de un rango de caracteres en una clase

Si no quiere los caracteres de una clase, tiene que agregar el símbolo ˆ al principio de la clase. Este símbolo es el mismo que el que indica la palabra al comienzo de la cadena.

Por ejemplo:

<?php
if (preg_match("/n[ˆa-z]/","Ponemos una admiración!")) {
echo "La cadena contiene la letra ’n’ seguida de un carácter no
alfabético.";
}
else {
echo "La cadena no contiene la letra ’n’ seguida de un carácter no
alfabético.";
}
?>

Da como resultado:

La cadena contiene la letra ’n’ seguida de un carácter no alfabético.

En efecto, la palabra admiración contiene una letra n seguida de un carácter que no es una letra, por lo que la expresión regular devuelve verdadero.

  • i. Los cuantificadores

Los cuantificadores sirven para definir el número de veces que se repite un carácter o una clase. Los tres principales cuantificadores son:

El símbolo ?: indica que no aparece el carácter o la clase anterior.

Por ejemplo:

<?php
if (preg_match("/da?m/","En el puerto de Amsterdam.")) {
echo "La cadena contiene dam o dm.";
}
else {
echo "La cadena no contiene dam o dm.";
}
?>

Da como resultado:

La cadena contiene dam o dm.

La expresión regular busca en la cadena "En el puerto de Amsterdam" la letra d seguida de la letra a y de la letra m.

El símbolo + indica una o varias apariciones del carácter o de la clase anterior.

Por ejemplo:

<?php
if (preg_match("/da+m/","En el puerto de Amsterdam.")) {
echo "La cadena contiene dam o daam o daaam...";
}
else {
echo "La cadena no contiene dam o daam o daaam...";
}
?>

Da como resultado:

La cadena contiene dam o daam o daaam...

La expresión regular busca en la cadena "En el puerto de Amsterdam" la letra d seguida de una o varias veces la letra a y de la letra m.

El símbolo * indica cero, una o varias apariciones del carácter o de la clase anterior.

Por ejemplo:

<?php
if (preg_match("/da*m/","En el puerto de Amsterdam.")) {
echo "La cadena contiene dm o dam o daam o daaam...";
}
else {
echo "La cadena no contiene dm o dam o daam o daaam...";
}
?>

Da como resultado:

La cadena contiene dm o dam o daam o daaam...

La expresión regular busca en la cadena "En el puerto de Amsterdam" la letra d seguida de una o varias veces la letra a y seguida de la letra m.

  • j. Intervalos de reconocimiento

Sirven para definir con precisión cuántas veces se puede repetir un carácter o un grupo de caracteres. Este intervalo se realiza con las llaves {}.
  • Si quiere que la letra "a" se repita exactamente dos veces, la expresión regular es: a{2}
  • Si quiere que la letra "a" se repita al menos dos veces, la expresión regular es: a{2,}
  • Si quiere que la letra "a" se repita entre dos y cinco veces, la expresión regular es: a{2,5}

Por ejemplo:

<?php
if (preg_match("/1{1,}/","N° de teléfono:0034912569875.")) {
echo "Está por lo menos una vez el número 1 en su N° de
teléfono.";
}
else {
echo "No está el número 1 en su N° de teléfono.";
}
?>

Da como resultado:

Está por lo menos una vez el número 1 en su N° de teléfono.

Si en su expresión regular pone una cadena con un ?, por ejemplo, si quiere buscar la cadena "¿Quién?", no tiene que interpretar el ? como un cuantificador que indica 0 o 1 del carácter anterior. Para evitar esto, tiene que usar el símbolo \ (barra invertida) que permite evitar el símbolo siguiente \, es decir, no interpretarlo como un símbolo, sino como un carácter.

Por ejemplo:

<?php
if (preg_match("/\?/","¿Quién esta ahí?")) {
echo "Está el carácter ? en su frase.";
}
else {
echo "No está el carácter ? en su frase.";
}
?>

Da como resultado:

Está el carácter ? en su frase.

Atención: Los símbolos ?, +, ˆ, *, $ se interpretan como caracteres, y no como símbolos de expresiones regulares cuando están dentro de una clase [...].

Observe que resulta muy difícil escribir una expresión regular. Por fortuna, puede encontrar fácilmente en Internet las expresiones regulares más utilizadas.

A continuación encontrará una expresión regular que comprueba si una dirección de correo electrónico es válida:

<?php
$email = "Juan.lopez@españa.es";
if (preg_match("/ˆ[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$/",
$email)) {
echo "La dirección de correo electrónico es válida.";
}
else {
echo "La dirección de correo electrónico no es válida.";
}
?>

Da como resultado:

La dirección de correo electrónico es válida.




Espero haber ayudado en algo. Hasta la próxima oportunidad!







No hay comentarios:

Publicar un comentario en la entrada