2012-03-06 19 views
11

Actualmente estoy escribiendo un pequeño script que comprueba el contenido de cada cadena.Cómo comprobar si string tiene al menos una letra, número y carácter especial en php

Me preguntaba qué sería el REGEX para asegurarme de que una cadena tenga una letra (superior o inferior), un dígito y un carácter especial.

Esto es lo que sé hasta ahora (lo que se agradece no es mucho):

if(preg_match('/^[a-zA-Z0-9]+$/i', $string)): 

ayuda sería grande!

¡Gracias!

+2

favor definir qué quiere decir con "carácter especial" –

Respuesta

40

La forma más fácil (y probablemente mejor) manera es hacer tres cheques por separado con preg_match:

$containsLetter = preg_match('/[a-zA-Z]/', $string); 
$containsDigit = preg_match('/\d/',   $string); 
$containsSpecial = preg_match('/[^a-zA-Z\d]/', $string); 

// $containsAll = $containsLetter && $containsDigit && $containsSpecial 
+0

bonito, ¡funcionado bien! :) –

+0

@ rybo111: No, no pueden. 'A-z' contiene más caracteres que' a-zA-Z'. – Ryan

+1

@ rybo111: Por favor, deje de editar mi respuesta para que sea menos clara. Nadie "solicitó if()", y no es como si no pudiera usar las variables en una. – Ryan

4

Puede ser mejor usar 3 regexs distintas de hacer esto, ya que lo que se necesita para que coincida con 6 posibilidades diferentes , dependiendo de dónde estén tus personajes especiales en tu cadena. Pero si quieres hacerlo en una expresión regular, y sus caracteres especiales son, por ejemplo, [? + @], Es posible:

$string = "[email protected]"; 
$regex = "/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$%^&]).*$/" 
if (preg_match($regex, $string)) { 
    // special characters 
} 
11

Usted puede utilizar positivo lookahead para crear una sola expresión regular:

$strongPassword = preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$%^&]).*$/'); 
//            special characters ^^^^ 
5

He encontrado una gran respuesta aquí con una explicación para asegurarse de que una cadena dada contiene al menos un personaje de cada una de las siguientes categorías.

caracteres en minúsculas, carácter en mayúscula, dígito, Símbolo

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*(_|[^\w])).+$ 

Una breve explicación:

^ // al inicio de la cadena

(?=.*[a-z]) // utilizar mirada positiva por delante para ver si existe al menos una letra minúscula

(?=.*[A-Z]) // utilizar mirada positiva hacia adelante para ver si al menos una letra mayúscula existe

(?=.*\d) // utilizar mirada positiva hacia adelante para ver si existe al menos un dígito

(?=.*[_\W]) // utilizar mirada positiva por delante de ver si existe al menos un subrayado o el carácter no-palabra

.+ // engullir toda la cadena

$ // el final de la cadena

Espero que te ayuden.

3

Una carta es \pL, un número es \pN y un char especial es [what you want], aquí supongo que no es una carta y no un número, por lo que la expresión regular se ve así:

/^(?=.*?\pL)(?=.*?\pN)(?=.*[^\pL\pN])/ 
+3

Es bueno incluir caracteres no ingleses. a menudo pasado por alto. – dval

1

Falso (respuesta elegida arriba - ¡Gracias!) tenía la manera bastante sencilla de entenderlo (si no está muy familiarizado con la expresión regular) y pensar qué le conviene más.

acabo de poner esto en la elaboración de un bit:

(que puede pegarla en http://phptester.net/index.php?lang=en para trabajar con él)

<?php 

$pass="abc1A"; 

$ucl = preg_match('/[A-Z]/', $pass); // Uppercase Letter 
$lcl = preg_match('/[a-z]/', $pass); // Lowercase Letter 
$dig = preg_match('/\d/', $pass); // Numeral 
$nos = preg_match('/\W/', $pass); // Non-alpha/num characters (allows underscore) 

if($ucl) { 
    echo "Contains upper case!<br>"; 
} 

if($lcl) { 
    echo "Contains lower case!<br>"; 
} 

if($dig) { 
    echo "Contains a numeral!<br>"; 
} 

// I negated this if you want to dis-allow non-alphas/num: 
if(!$nos) { 
    echo "Contains no Symbols!<br>"; 
} 

if ($ucl && $lcl && $dig && !$nos) { // Negated on $nos here as well 
    echo "<br>All Four Pass!!!"; 
} else { 
    echo "<br>Failure..."; 
} 

?> 
Cuestiones relacionadas