Sigueme por RSS! RSS

ctype_alnum_plus: ctype_alpha, espacios y más

Entre las fuentes de tráfico de cassianet me encuentro con la consulta "como utilizar ctype_alpha y espacios en PHP". Esta función:

Verifica si todos los caracteres en la cadena entregada, texto, son alfabéticos. En la localidad C estándar las letras se limitan a [A-Za-z] y ctype_alpha() es equivalente a (ctype_upper($texto) || ctype_lower($texto)) si $texto es un caracter sencillo, aunque otros idiomas usan letras que no son consideradas como mayúsculas ni minúsculas.

Eso significa que si pasamos a validar de la siguiente manera:
echo (ctype_alpha('abcdefg ABCDE') ? 'Es alfabético' : 'No es alfabético')

El resultado será "No es alfabético" por la sencilla razón de que el espacio no es una letra.

Algo parecido sucede con la función ctype_alnum que en este caso equivale a
preg_match('/^[a-z0-9]*$/i',$texto)
aceptando solo letras y números pero no así espacios u otros caracteres.

Ambas funciones son bastantes estrictas, el problema se nos presenta cuando tenemos un campo del tipo nombre, apellidos, username, password, etc. que puede requerir bajar las restricciones, de manera que se puedan validar como correctos cadenas de caracteres como: O'Donell, D'Angelo, Mc-Bride, Alí, De' Alessandro, María, algún nick, etc.

No he encontrado una función que haga eso por si sola, así que arme una, que además, se le puede dar varios usos:

/**
 * Función: ctype_alnum_plus
 * Autor: Reinaldo Cassiani (cass)
 * Sitio Web: http://cassianinet.blogspot.com/2011/04/ctypealpha-y-espacios-en-php.html
 * Last update: 30/01/2012
 * Descripción: valida una cadena de caracteres pasada como argumento, 
 *              permite personalizar la validación, pudiéndose aumentar 
 *              o disminuir la restricción de caracteres.
 *
 * Default valor: valida cadenas alfabéticas con espacios
 * Parámetros:
 +  1[string] (obligatorio): cadena de caracteres a validar.
 *
 +  2[string] (opcional): atajos de las restricciones separados por ; 
 -    esp --> espacios ( )
 -    ace --> acentos (á)
 -    dia --> diéresis (ä)
 -    ene --> eñes (Ñ)
 -    gui --> guiones (-)
 -    pun --> puntos (.)
 -    num --> números (0-9)
 -    und --> underscores (_)
 -    apo --> apostrofes (')
 -    com --> comas (,)
 -    2pu --> dos puntos (:)
 -    puc --> punto y coma (;)
 -    par --> paréntesis ()
 -    cor --> corchetes ([])  
 *
 +  3[boolean] (opcional): determina si se visualizan los errores.
**/
function ctype_alnum_plus($sCadena,$restriccion='esp',$MostrarError=true){
   if(empty($sCadena)){
 if($MostrarError)
  die('ctype_alnum_plus: el primer parámetro es obligatorío.');
    else return false;
   }
   $restriccion = trim($restriccion,';');
   $sAtajos     = array('esp','ace','dia','ene','gui','pun',
                    'num','und','apo','com','2pu','puc',
                    'par','cor');
   if (strlen($restriccion)>3 and strpos($restriccion,';')===false){
      if ($MostrarError) 
 die('ctype_alnum_plus: el segundo parámetro sólo acepta ('
 .implode(',',$sAtajos).') separados por punto y coma (;)');
      else return false;
   }   
   $sExpr = array('esp'=>'\s','ace'=>'ÁÉÍÓÚáéíóú','dia'=>'ÄËÏÖÜäëïöü','ene'=>'Ññ',
                  'pun'=>'\.','gui'=>'\-','num'=>'\d','und'=> '_','apo'=>"\'",
                  'com'=>',','2pu'=>':','puc'=>';','par'=>'()','cor'=>'\[\]');
   $sPatron  = '/^[a-z';
   $restriccion = strtolower($restriccion);
   if ($restriccion=='esp'){
      $sPatron .= $sExpr['esp'];
   }else{
      $arrRestriccion = explode (';',$restriccion);
      foreach ($arrRestriccion as $name) {
         if (!in_array($name,$sAtajos)) {
            if($MostrarError) 
  die('ctype_alnum_plus: el segundo parámetro sólo acepta ('
                .implode(',',$sAtajos).') separados por punto y coma (;)');
            else return false;
         }
         $sPatron .= $sExpr[$name];
      }
   }
   $sPatron .= ']+$/i';
   return preg_match($sPatron,$sCadena) ? true : false;
}

Para llamar a la función:
ctype_alnum_plus('cadena a validar')

En este caso devolverá true ya que por defecto/default permite espacios y letras de la A la Z sean mayúsculas o minúsculas.

ctype_alnum_plus puede recibir tres parámetros:
1.- (obligatorio) la cadena a validar.
2.- (opcional) atajos a las restricciones separados por punto y coma (;)
pueden ser:
  • esp --> espacios
  • ace --> acentos
  • dia --> diéresis
  • ene --> eñes
  • gui --> guiones
  • pun --> puntos
  • num --> numeros
  • und --> underscores
  • apo --> apostrofes
  • 2pu --> dos puntos
  • puc --> punto y coma
  • par --> paréntesis
  • cor --> corchetes
3.- (opcional) controla la visualización de errores, recibe los valores true y false, cabe acotar que cualquier valor diferente de cero siempre será tomado como true ya que las variables booleanas como tal, no existen en PHP.

echo ctype_alnum_plus('Alí Güiza');// devuelve false
echo ctype_alnum_plus('Sr. Omar E. Martín F.');// devuelve false
echo ctype_alnum_plus('Leonardo Scott-Ellis');// devuelve false
echo ctype_alnum_plus('Sofía Yáñez');// devuelve false
echo ctype_alnum_plus('Jhon O\'Donell');// devuelve false
echo ctype_alnum_plus('mi_nick8127');// devuelve false

Para que cadenas de caracteres como la del ejemplo anterior sean tomadas como correctas, hay que aumentar o disminuir las restricciones especificándolo en el segundo parámetro de ctype_alnum_plus.
// permitiendo espacios, diéresis y acentos
echo ctype_alnum_plus('Alí Güiza','esp;dia;ace');// devuelve true

// permitiendo puntos, espacios, acentos y guiones
echo ctype_alnum_plus('Sr. Omar E. Martín-Flores','esp;pun;ace;gui');// devuelve true

// permitiendo espacios y guiones
echo ctype_alnum_plus('Leonardo Scott-Ellis','esp;gui');// devuelve true

// permitiendo acentos, espacios y eñes
echo ctype_alnum_plus('Sofía Yáñez','esp;ace;ene');// devuelve true

// permitiendo espacios, acentos y apóstrofes
echo ctype_alnum_plus('Jhon O\'Donell','esp;apo');// devuelve true

// permitiendo unerscores y números
echo ctype_alnum_plus('mi_nick8127','und;num');// devuelve true

if (ctype_alnum_plus('mi_nick8127','und;num'))
   echo 'Valor correcto';
else
   echo 'Valor incorrecto';

Si quieres usar la función en varios archivos, puedes almacenarla en uno llamado funciones.php por ejemplo y luego incluirla en cada script que la requiera:
require_once('funciones.php')


En el caso de que uses CodeIgniter (CI), puedes disponer de la función en toda la aplicación agregándola a tu propio helper, (mod_ppal_helper.php) por ejemplo, ubicado en la carpeta system/helper de CI. Luego sólo hay que indicarle al framework que la cargue por defecto, eso lo hacemos en el config/autoload.php:
$autoload['helper'] = array('mod_ppal');

ejemplo de uso (en nuestro controlador):
function _es_valido_nombre($cadena){
      return ctype_alnum_plus($cadena,'esp;ace;apo;ene');
}

y si usamos la librería de validación (form_validation):
... 
$arrValidaciones = array(
        array(
            'field'   => 'txtNombre',
            'label'   => 'Nombre',
            'rules'   => 'required|min_length[3]|max_length[30]|callback__es_valido_nombre'
        )
    );
    $this->form_validation->set_rules($arrValidaciones);
...


Referencia:

0 comentarios: Suscribete a los comentarios por RSS

Publicar un comentario

- Los comentarios están siendo moderados y serán publicados en la brevedad posible.