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
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:
php-es.com
- Los comentarios están siendo moderados y serán publicados en la brevedad posible.