2012-10-13 22 views
5

Jestem bardzo nowe do wyrażenia regularnego, zrobiłem badania i mam trochę zrozumienia co potrzebne jest hasło, które pasuje do tych specyfikacjizabezpieczone hasłem z wyrażenia regularnego

  1. dowolny znak literowy (przynajmniej jeden)
  2. dowolny znak numeryczny (przynajmniej jeden)
  3. bez spacji
  4. znaki specjalne (0 lub więcej)

co mam na to za

^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]+)(?!\S)$ 

który pasuje 1, 2, 3 specyfikacji, ale nie 4 Próbowałem różnych rzeczy na 4, ale nie udało mi się

może ktoś mi pomóc?

Odpowiedz

6

Jesteś bardzo blisko. To wydaje się rozwiązać twój problem:

preg_match("/^(?=.*[0-9])(?=.*[a-z])(\S+)$/i", $password) 

Wprowadziłem dwie zmiany.

  1. Wystarczy trochę skrócić za pomocą modyfikatora i (nieuwzględniającego wielkości liter). Pozwala to na usunięcie A-Z`.
  2. Naprawdę nie pomogło mi tutaj (?!\S). Zamiast tego możesz po prostu sprawić, że rzeczywiste dopasowanie składa się tylko ze znaków spoza przestrzeni (\S+). Spowoduje to natychmiastowe zezwolenie na wpisywanie znaków specjalnych w haśle (naprawdę wszystko, co dotyczy spacji).

Jeśli chcesz zezwolić na określony zestaw znaków specjalnych, zastąp \S klasą znaków zawierającą litery, cyfry i wszystkie znaki, na które chcesz zezwolić. Przy okazji, jeśli chcesz się upewnić, że twoje hasło ma pewną minimalną długość, możesz zmienić na przykładna {8,}.

+0

perfekcyjna praca, dziękuję, chciałbym +100 :) Ci ale potrzebuje 15 reputacji i mam tylko 8, dziękuję jeszcze raz :) –

+0

Albo jeszcze szybciej ... '/^(? = [^ 0-9 ] * [0-9]) (? = [^ Az] * [az]) (\ S +) $/i' – ridgerunner

0

Wydaje się być coś takiego:

^(?=.*[0-9])(?=.*[a-zA-Z])(?=\S*$)(?=[0-9a-zA-Z.,;[email protected]#$%^&*()\-+=\\\]+$) 

Dodaj wszystkie znaki specjalne, których potrzebujesz.

Edit: odpowiadanie na niektóre komentarze, oto wynik testu:

<?php 

$re = '/^(?=.*[0-9])(?=.*[A-Z])(?=\S*$)(?=[0-9a-zA-Z.,;[email protected]#$%^&*()\-+=\\\]+$)/'; 

$s = 'A2x.'; 

echo preg_match($re, $s); 

?> 

Testowane z CLI pod Ubuntu:

[email protected]$ php _.php 
1 

I robi 0 lub 1 zależności od wartość: $s;)

+0

To wyrażenie nigdy nie może być dopasowane, ponieważ zawiera dwa znaki końca wiersza ('$'). – duskwuff

+0

Edytowane: wynik testu –

+0

Rozwiązanie m.buettner jest idealne. Awans. –

1

Użyj trzech oddzielnych wyrażeń regularnych - jeden do che ck, że istnieje znak alfabetyczny, jeden do sprawdzenia, czy istnieje cyfra, a drugi do sprawdzenia, czy nie ma spacji. Chociaż można to zrobić za pomocą pojedynczego wyrażenia regularnego, każdy dodatkowy warunek znacznie zwiększa złożoność wyrażenia regularnego.

preg_match("/[a-z]/i", $passwd) && preg_match("/[0-9]/", $passwd) && !preg_match("/ /", $passwd) 
3

Nie ma potrzeby stosowania dziwnego wyrażenia regularnego. Zwłaszcza, że ​​chcesz, aby upewnić się, że hasło zawiera lub nie zawiera, i nie ma znaczenia, gdzie wydaje się:

<?php 

/** 
* Validates the password: 
* * Has at least one alphabet character 
* * Has at least one digit 
* * Has no spaces 
* 
* @param string $password Password to validate 
* 
* @return bool    Whether $password is valid or not. 
*/ 
function validate_password($password) { 
    //If no alphabet characters found, return false. 
    if (!preg_match("/[a-z]/i", $password)) { 
     return false; 
    } 
    //If no digits found, return false. 
    if (!preg_match("/[0-9]/", $password)) { 
     return false; 
    } 
    //If a space is found, return false. 
    if (strpos($password, " ") !== false) { 
     return false; 
    } 
    //Special characters are optional, so no checking. 
    //If nothing happened so far, the password is valid. Return true. 
    return true; 
} 

var_dump(
    validate_password("test"),   //False, no digits 
    validate_password("test123 test"), //False, space 
    validate_password("123456"),  //False, no alphabet 
    validate_password("test1234")  //True 
); 
+0

+1 Można również utworzyć "próg", aby upewnić się, że co najmniej 3 z 4 zostały spełnione lub coś w tym stylu ... tj. Zamiast zwracać za jedną porażkę, należy liczyć liczbę spełnionych warunków. Następnie zwróć, aby liczba była powyżej wymaganego progu. – jheddings

Powiązane problemy