Как проверить, есть ли в строке хотя бы одна буква, число и специальный символ в php - PullRequest
14 голосов
/ 06 марта 2012

В настоящее время я пишу небольшой скрипт, который проверяет содержимое каждой строки.

Мне было интересно, что такое REGEX, чтобы убедиться, что строка имеет букву (верхнюю или нижнюю), цифру,и специальный символ?

Вот что я знаю до сих пор (что не так уж много):

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

Справка была бы отличной!

Спасибо!

Ответы [ 6 ]

48 голосов
/ 06 марта 2012

Самый простой (и, вероятно, лучший) способ - выполнить три отдельные проверки с помощью 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
11 голосов
/ 06 марта 2012

Вы можете использовать положительное значение lookahead для создания одного регулярного выражения:

$strongPassword = preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$%^&]).*$/');
//                                              special characters  ^^^^
9 голосов
/ 06 марта 2012

Я нашел отличный ответ здесь с объяснением, чтобы убедиться, что данная строка содержит хотя бы один символ из каждой из следующих категорий.

строчные буквы, Прописная буква, Digit, Символ

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

Краткое объяснение:

^ // начало строки

(?=.*[a-z]) // использовать положительный взгляд вперед, чтобы увидеть, существует ли хотя бы одна строчная буква

(?=.*[A-Z]) // использовать положительный взгляд вперед, чтобы увидеть, существует ли хотя бы одна заглавная буква

(?=.*\d) // использовать положительный взгляд вперед, чтобы увидеть, существует ли хотя бы одна цифра

(?=.*[_\W]) // использовать положительный взгляд вперед, чтобы увидеть, существует ли хотя бы один символ подчеркивания или неслова

.+ // сожрать всю строку

$ // конец строки

Надеюсь, это поможет вам.

4 голосов
/ 06 марта 2012

Для этого может быть лучше использовать 3 различных регулярных выражения, поскольку вам нужно будет сопоставить 6 различных возможностей, в зависимости от того, где находятся ваши специальные символы в вашей строке.Но если вы хотите сделать это в одном регулярном выражении, и ваши специальные символы, скажем, [+? @], Это возможно:

$string = "abc@123";
$regex = "/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$%^&]).*$/"
if (preg_match($regex, $string)) {
   // special characters
}
3 голосов
/ 06 марта 2012

Буква \pL, число \pN и специальный символ [what you want], здесь я предполагаю, что это не буква и не число, поэтому регулярное выражение выглядит так:

/^(?=.*?\pL)(?=.*?\pN)(?=.*[^\pL\pN])/
2 голосов
/ 03 июля 2014

False (выбранный ответ выше - спасибо!) Был довольно простой способ обернуть голову вокруг него (если вы не слишком знакомы с регулярным выражением) и придумать, что работает для вас.

Я просто добавил это, чтобы уточнить:

(вы можете вставить его на http://phptester.net/index.php?lang=en для работы с ним)

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

?>
...