2010-04-16 22 views
9

¿Cuál es una forma eficiente de comprobar si un nombre de usuario contiene una serie de caracteres especiales que defino.Prueba de caracteres especiales de PHP

Ejemplos:% # ^. ! @ &() +/"` ~ <> {} [] | = -;?.

necesito para detectarlos y devolver un valor lógico, no sólo despojar a cabo

Probablemente una pregunta muy fácil, pero Necesito una forma mejor de hacer esto que una gran lista de condicionales o un bucle descuidado.

Respuesta

9

Cuanto mejor es determinar si hay caracteres que no están en la lista de permitidos, como:

preg_match('![^a-z0-9]!i', $nickname); 
+3

+1: Las listas blancas son una mejor herramienta de seguridad que las listas negras. –

+0

Gracias! Disculpe mi inexperiencia con Regex, pero ¿cómo puedo permitir los guiones bajos? – pws5068

+0

acaba de agregar _ después de char '9' – zerkms

3

Con expresiones regulares, los \ w caracteres especiales significan "cualquier palabra de caracteres" y el \ d significa dígitos. El^en los paréntesis significa negar o básicamente cualquier cosa que no esté entre corchetes. El código siguiente haría eco "verdadero" o un 1 para indicar que la cadena tiene caracteres que no son palabras.

$string = '% #^. ! @ & () +/" ? ` ~ < > { } [ ] | = - ;' 
echo preg_match('~[^\w\d]~', $string); 
+0

tratando de ser el puño - se le olvidó que las cadenas limitadas con comillas ;-) – zerkms

+0

Sí, entendí eso. ;) –

3

expresión regular suele ser el camino a seguir para probar un rango permitido, entidades particular alfanuméricos como nombres de usuario Sin embargo, si el conjunto de caracteres no permitidos es pequeño y/o no secuencial (es decir, no expresados ​​fácilmente con rangos) se puede obtener un mejor rendimiento con esto:

strspn($string,'%#^[email protected]&()+/"?`~<>{}[]|=-'); 

Esto devuelve la longitud de la primera subcadena que se encuentra que se compone únicamente de los caracteres no permitidos (que será 0 si no están presentes caracteres no permitidos).

2

se puede usar algo como lo siguiente para contar el número de veces que aparece un personaje de un determinado conjunto de caracteres dentro de una cadena:

<?php 

/** 
* Count the number of times any char from $char is found in $search 
* @param $search Looks for the chars here 
* @param $chars The chars to look for 
* @return int 
*/ 
function countChars($search, $chars) 
{ 
    $chars = str_replace(
     array("\\", '[', ']', '^', '-'), 
     array("\\\\", '\[', '\]', '\^', '\-'), $chars); 

    $results = array(); 
    preg_match_all("/[$chars]/", $search, $results, PREG_SET_ORDER); 
    return count($results); 
} 

var_dump(countChars("Hello, World", "ol")); 
var_dump(countChars("Lorem ipsum...", ".m")); // searches for . and m only 
var_dump(countChars("^[]-^\\*", "^[]-\\")); 

Espero que ayude.