Как проверить, имеет ли строка хотя бы одну букву, номер и специальный символ в php
В настоящее время я пишу небольшой script, который проверяет содержимое каждой строки.
Мне было интересно, что REGEX должен удостовериться, что строка имеет букву (верхнюю или нижнюю), цифру и специальный символ?
Вот что я знаю до сих пор (чего не много):
if(preg_match('/^[a-zA-Z0-9]+$/i', $string)):
Помощь будет отличной!
Спасибо!
Ответы
Ответ 1
Самый простой (и, вероятно, лучший) способ - сделать три отдельных проверки с помощью 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
Ответ 2
Вы можете использовать позитивный lookahead для создания одного регулярного выражения:
$strongPassword = preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$%^&]).*$/');
// special characters ^^^^
Ответ 3
Я нашел отличный ответ здесь с объяснением, чтобы убедиться, что данная строка содержит по крайней мере один символ из каждой из следующих категорий.
Нижний регистр,
Прописная буква,
Digit,
Символ
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*(_|[^\w])).+$
Краткое объяснение:
^
//начало строки
(?=.*[a-z])
//используйте положительный взгляд вперед, чтобы увидеть, существует ли хотя бы одна строчная буква
(?=.*[a-z])
//используйте положительный взгляд вперед, чтобы увидеть, существует ли хотя бы одна буква верхнего регистра
(?=.*\d)
//используйте положительный взгляд вперед, чтобы увидеть, существует ли хотя бы одна цифра
(?=.*[_\W])
//используйте положительный взгляд вперед, чтобы увидеть, существует ли хотя бы один символ подчеркивания или не-слова
.+
//сожраем всю строку
$
//конец строки
Надеюсь, что вам помогут.
Ответ 4
Лучше всего использовать 3 разных регулярных выражения, так как вам нужно будет соответствовать 6 различным возможностям, в зависимости от того, где ваши специальные символы в вашей строке. Но если вы хотите сделать это в одном регулярном выражении, а ваши специальные символы, скажем, [+? @], Возможно:
$string = "[email protected]";
$regex = "/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$%^&]).*$/"
if (preg_match($regex, $string)) {
// special characters
}
Ответ 5
Буква \pL
, число \pN
, а специальное char - [what you want]
, здесь я предполагаю, что это не буква, а не число, поэтому регулярное выражение выглядит так:
/^(?=.*?\pL)(?=.*?\pN)(?=.*[^\pL\pN])/
Ответ 6
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...";
}
?>