> Manuales > Taller de PHP

Hacemos un script para validar una cadena, en la que sólo se permiten apariciones de un reducido juego de caracteres, por dos métodos, con funciones de string y con expresiones regulares.

En algunas ocasiones tenemos que comprobar la validez de una cadena de caracteres para ver si contiene solamente aquellos que consideramos como válidos. Por ejemplo, si tuviéramos que validar un nombre de usuario, podríamos permitir números, letras y ocasionalmente caracteres "-" o "_", pero no otro tipo de caracteres como "+", "@", "&", etc. Además, siendo un nombre de usuario, podemos tener fijados un máximo y mínimo número de caracteres.

Esta es una de las comprobaciones más simples que se pueden hacer en una cadena, pero no por ello menos importante. Veremos en este artículo una manera de realiza esa comprobación usando las funciones de string y también usando expresiones regulares de PHP.

Usando las funciones de tratamiento de string de PHP

Vamos a realizar una función que reciba un string de un nombre de usuario y compruebe si es correcto. Como hemos dicho, la comprobación tendrá dos partes, la primera para ver si la longitud de la cadena está permitida (entre 3 y 20 caracteres) y la segunda para asegurar que los caracteres utilizados están entre los permitidos.

function comprobar_nombre_usuario($nombre_usuario){
   //compruebo que el tamaño del string sea válido.
   if (strlen($nombre_usuario)<3 || strlen($nombre_usuario)>20){
      echo $nombre_usuario . " no es válido<br>";
      return false;
   }

   //compruebo que los caracteres sean los permitidos
   $permitidos = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_";
   for ($i=0; $i<strlen($nombre_usuario); $i++){
      if (strpos($permitidos, substr($nombre_usuario,$i,1))===false){
         echo $nombre_usuario . " no es válido<br>";
         return false;
      }
   }
   echo $nombre_usuario . " es válido<br>";
   return true;
}


La primera parte es muy sencilla, simplemente se mira si la longitud de la cadena es menor que 3 o mayor que 5, porque en ese caso el nombre de usuario sería incorrecto. Para la segunda comprobación, de caracteres válidos, hemos definido una variable local a la función que contiene una cadena con todos los caracteres permitidos para el nombre de usuario. Luego, para cada carácter del string que se desea comprobar, veremos si está contenido dentro de la variable local. En el momento que la cadena con el nombre de usuario tenga un carácter que no esté entre los permitidos, diremos que el nombre de usuario es incorrecto.

Si no nos salimos de la función después de todas las comprobaciones realizadas, es que el nombre de usuario es correcto.

Usando expresiones regulares de PHP

Ahora vamos a ver un método distinto para hacer la misma comprobación, en este caso utilizando expresiones regulares de PHP. Las expresiones regulares permiten comparar la cadena con un patrón, para ver si se ajusta o no a ese patrón.

Existe una función de PHP llamada ereg() que recibe el patrón realizado con una expresión regular y un string para ver si se ajusta al patrón. No es el objetivo explicar las expresiones regulares, aunque comentaremos cómo hemos construido el patrón para este ejemplo. La función ereg() devuelve la longitud de la cadena encontrada que corresponde con el patrón y false, si no encuentra coincidencia entre la expresión regular y el string.

Veamos primero la función que hemos creado para verificar la validez del nombre de usuario:

function comprobar_nombre_usuario_expresiones_regulares($nombre_usuario){
   if (ereg("^[a-zA-Z0-9\-_]{3,20}$", $nombre_usuario)) {
      echo "El nombre de usuario $nombre_usuario es correcto<br>";
      return true;
   } else {
       echo "El nombre de usuario $nombre_usuario no es válido<br>";
      return false;
   }
}


Simplemente se ejecuta la función ereg() y se evalúa el resultado devuelto. Si sale por el caso positivo es que era correcto el nombre de usuario. Si ereg() devuelve un resultado que se evalúa negativamente, el usuario era incorrecto.

La dificultad de esta función está en crear la expresión regular que necesitamos para la pasarla a ereg(). En este caso se realizan las dos comprobaciones mencionadas (longitud del nombre de usuario y caracteres permitidos) en un único paso.

Para entender la función necesitamos conocer algunos símbolos especiales de expresiones regulares en PHP:

"^" Significa que la cadena tiene que empezar por ahí. Por ejemplo la expresión "^hola" concordaría con cualquier cadena que empezase por "hola".

[] se utilizan para indicar un carácter entre varios que se pongan entre los corchetes. Por ejemplo ^[xyz] concordaría con cualquier cadena que comenzase por "x", "y" o "z". Dentro de los corchetes, se pueden poner intervalos de varias letras o números. Por ejemplo [a-z] significa cualquier letra minúscula, desde la "a" a la "z". [0-9] es cualquier número del 0 al 9. [a-zA-Z0-9] es cualquier letra, mayúscula o minúscula, y cualquier número.

Si queremos escribir en el patrón un carácter que se utiliza como un código especial de expresiones regulares, como "-" o ".", se tiene que escribir con una contrabarra delante. Por ejemplo "\-" o "\.".

Luego, [a-zA-Z0-9\-_] es cualquier carácter de los permitidos (letras minúsculas y mayúsculas, números, "-" y "_").

{} Las llaves se utilizan para especificar repeticiones de lo que va delante. Por ejemplo [0-9]{4} quiere decir que hay 4 números. a{3,} quiere decir por lo menos 3 repeticiones de "a". [a-zA-Z0-9\-_] {3,20} quiere decir que cualquiera de los caracteres permitidos en nuestros nombres de usuario, repetidos de 3 a 20 veces.

Por último, el carácter "$" significa que la cadena tiene que terminar ahí. Por ejemplo, la expresión regular "adios$" concordaría con cualquier cadena que terminase en "adios".

Nuestra expresión regular: "^[a-zA-Z0-9\-_]{3,20}$" significa que empiece la cadena por cualquier carácter permitido, que se encuentren de 3 a 20 caracteres permitidos y que la cadena termine después de esas repeticiones. Si el nombre de usuario cumple ese patrón, es que es correcto.

Eso es todo. Hemos visto dos formas de hacer lo mismo, aunque con expresiones regulares queda un código más elegante. Espero que también sirva de introducción para los que nunca antes habían trabajado con ellas.

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online Escu...

Manual