2012-03-06 8 views
11

Obecnie piszę mały skrypt, który sprawdza zawartość każdego ciągu.Jak sprawdzić, czy ciąg ma co najmniej jedną literę, cyfrę i znak specjalny w php

Zastanawiam się, co REGEX byłoby, aby upewnić się, że ciąg znaków ma literę (górną lub dolną), cyfrę i znak specjalny?

Oto, co wiem do tej pory (whcih nie jest dużo):

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

Pomoc byłoby świetnie!

Dziękujemy!

+2

Proszę określić, co masz na myśli przez „szczególnym charakterze” –

Odpowiedz

40

Najprostszym (i prawdopodobnie najlepszym) sposobem jest zrobić trzy oddzielne kontrole z 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

nice one, działało dobrze! :) –

+0

@ rybo111: Nie, nie mogą. 'A-z' zawiera więcej znaków niż' a-zA-Z'. – Ryan

+1

@ rybo111: Przestań edytować moją odpowiedź, aby było mniej jasne. Nikt "nie zażądał if()" i nie jest tak, że nie można używać zmiennych w jednym. – Ryan

4

To może być najlepszy w użyciu 3 różnych regexs to zrobić, ponieważ trzeba by dopasować 6 różnych możliwości , w zależności od tego, gdzie w łańcuchu znajdują się twoje znaki specjalne. Ale jeśli chcesz to zrobić w jednym regex, a twoje znaki specjalne, powiedzmy, [+ @], możliwe jest:

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

można wykorzystywać pozytywne lookahead aby utworzyć pojedynczy regex:

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

Znalazłem tutaj świetną odpowiedź z wyjaśnieniem, aby upewnić się, że dany ciąg zawiera co najmniej jeden znak z każdej z poniższych kategorii.

charakter Lowercase, wielką literą, Digit, Symbol

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

Krótkie wyjaśnienie:

^ // początek napisu

(?=.*[a-z]) // wykorzystywać pozytywne spojrzenie w przyszłość aby sprawdzić, czy istnieje co najmniej jedna mała litera:

(?=.*[A-Z]) // wykorzystywać pozytywne spojrzenie w przyszłość, aby zobaczyć, jeśli co najmniej jeden górny literę istnieje

(?=.*\d) // wykorzystywać pozytywne spojrzenie w przyszłość, aby zobaczyć, jeśli co najmniej jedna cyfra istnieje

(?=.*[_\W]) // wykorzystywać pozytywne spojrzenie na przodzie sprawdzić, czy przynajmniej jeden znak podkreślenia lub nie istnieje słowo

.+ // pochłaniają cały ciąg

$ // koniec sznurka

Mam nadzieję, że ci pomogę.

3

List jest \pL, liczba jest \pN oraz specjalny char jest [what you want], tutaj zakładam, że nie jest to list, a nie ilość, więc regex wygląda następująco:

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

Fajnie, dołączasz znaki spoza angielskiego. często przoczane. – dval

1

False (wybraną odpowiedź powyżej - dzięki!) miał dość łatwy sposób na owinięcie głowy (jeśli nie jesteś zbyt zaznajomiony z regex) i wymyślić, co działa dla ciebie.

po prostu umieścić to w celu opracowania bitowe:

(można wkleić go w http://phptester.net/index.php?lang=en z nim pracować)

<?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..."; 
} 

?> 
Powiązane problemy