Preg_match для всех специальных символов, проверка пароля - PullRequest
3 голосов
/ 08 ноября 2011

Хорошо, поэтому я пишу проверку паролей для нашей политики паролей, которая требует 3 из 4 основных классификаций. Там, где у меня проблемы, это совпадение специальных символов.

Вот что у меня есть:

private function PasswordRequirements($ComplexityCount) {
    $Count = 0;
    if(preg_match("/\d/", $this->PostedData['password']) > 0) {
        $Count++;
    }
    if(preg_match("/[A-Z]/", $this->PostedData['password']) > 0) {
        $Count++;
    }
    if(preg_match("/[a-z]/", $this->PostedData['password']) > 0) {
        $Count++;
    }
    // This is where I need help
    if(preg_match("/[~`!@#$%^&*()_-+=\[\]{}\|\\:;\"\'<,>.]/", $this->PostedData['password']) > 0) {
        $Count++;
    }

    if($Count >= $ComplexityCount) {
        return true;
    } else {
        return false;
    }
}

Итак, в основном я проверяю строку для каждого регистра, цифр, прописных, строчных и специальных символов. У нас нет никаких ограничений на какие-либо специальные символы, и мне также нужны символы Unicode. Работает ли \ W в этом случае или это также будет включать числа снова? Я не могу найти отличную документацию по \ W, поэтому мне неясно в этой части.

Кто-нибудь знает о простом регулярном выражении, которое охватывало бы все специальные символы и символы Юникода, не содержащие цифр и букв?

Каждый может свободно использовать это, так как я думаю, что больше чем несколько человек искали это.

Ответы [ 3 ]

13 голосов
/ 08 ноября 2011

Этот шаблон будет разрешать все символы, которые не являются цифрами или -Z.

[^\da-zA-Z]

Относительно \W это отрицательный \w, который совпадает с [A-Za-z0-9_]. Таким образом, \W будет всеми символами, которые не являются английской буквой, цифрой или подчеркиванием.

Как я уже упоминал в качестве комментария , это отличный ресурс для изучения регулярных выражений. И вот хороший сайт для тестирования регулярных выражений .

7 голосов
/ 10 марта 2012

В случае, если вы хотите сопоставить специальные символы

preg_match('/[\'\/~`\!@#\$%\^&\*\(\)_\-\+=\{\}\[\]\|;:"\<\>,\.\?\\\]/', $input)
2 голосов
/ 08 ноября 2011

Вы можете использовать класс символов POSIX [[:punct:]] для «специальных» символов:

<?php
$regex = '[[:punct:]]';

if (preg_match('/'.$regex.'/', 'somepas$', $matches)) {
    print_r($matches);
}
?>

дает:

Array
(
    [0] => $
)
...