2011-10-13 9 views

Respuesta

77

Código:

if(preg_match('/[^a-z_\-0-9]/i', $string)) 
{ 
    echo "not valid string"; 
} 

Explicación:

  • [] definición => clase de caracteres
  • ^=> negar la clase
  • az => caracteres de la 'a' a la 'z'
  • _ => Destacar
  • - => guión '-' (Es necesario escapar de ella)
  • 0-9 => números (de cero a nueve)

El modificador 'i' al final de la expresión regular es para 'distinguir entre mayúsculas y minúsculas' si no lo incluye tendrá que agregar los caracteres en mayúscula en el código antes haciendo AZ

+0

Esto permite caracteres chinos como "你好" de todos modos para controlar esto también? – aahhaa

+2

@wlin necesita agregar '\ x {4e00} - \ x {9fa5}' a la definición de clase de charecter, también agregue el modificador 'u' para tratar la cadena y el patrón como UTF-8. Se verá así '/ [^ a-z _ \ - 0-9 \ x {4e00} - \ x {9fa5}]/ui' puede probarlo aquí: https://xrg.es/#1qvtb7n – SERPRO

15
if(!preg_match('/^[\w-]+$/', $string1)) { 
    echo "String 1 not acceptable acceptable"; 
    // String2 acceptable 
} 
+0

puede usted explica qué es 'w'? No entiendo muy bien este –

+0

caracteres alfanuméricos más "_", es decir [A-Za-z0-9_] – matino

+2

@matino: debe anclar su expresión regular, a menos que coincida con 'a; b' – Toto

-1

¿Por qué usar regex? PHP tiene algunas construido en la funcionalidad de hacer eso

<?php 
    $valid_symbols = array('-', '_'); 
    $string1 = "This is a string*"; 
    $string2 = "this_is-a-string"; 

    if(preg_match('/\s/',$string1) || !ctype_alnum(str_replace($valid_symbols, '', $string1))) { 
     echo "String 1 not acceptable acceptable"; 
    } 
?> 

preg_match('/\s/',$username) comprobará si hay espacio en blanco

!ctype_alnum(str_replace($valid_symbols, '', $string1)) que verifican los valid_symbols

1

\w\- es probablemente el mejor, pero aquí sólo otra alternativa
Uso [:alnum:]

if(!preg_match("/[^[:alnum:]\-_]/",$str)) echo "valid"; 

demo1 | demo2

0

Aquí es un método no cobarde expresiones regulares usando str_word_count():

if($string===str_word_count($string,1,'-_0...9')[0]){ 
//          ^^^^^^^--- characters to allow, see documentation 
    echo "pass"; 
}else{ 
    echo "fail"; 
} 

Ver las Demo Link donde muestro cómo las diferentes entradas resultan en diferentes matrices de salida.

0

Aquí hay un equivalente de la respuesta aceptada para el mundo UTF-8.

if (!preg_match('/^[\p{L}\p{N}_-]+$/u', $string)){ 
    //Disallowed Character In $string 
} 

Explicación:

  • [] => clase de caracteres definición
  • p {L} => coincide con cualquier tipo de personaje carta de cualquier idioma
  • p {N} => partidos cualquier tipo de carácter numérico
  • _- => coincide con subrayado y guión
  • + => Cuantificador - Coincide entre uno e ilimitados tiempos (codicioso)
  • /u => Modificador Unicode. Las cadenas de patrones se tratan como UTF-16.También causas secuencias de escape para que coincida con los caracteres Unicode

Tenga en cuenta, que si el guión es el último carácter de la definición de la clase que no necesita ser escapado. Si el guión aparece en otra parte de la definición de clase, se debe escanear , ya que se verá como un carácter de rango en lugar de un guión.

Cuestiones relacionadas