В настоящее время я пишу небольшой скрипт, который проверяет содержимое каждой строки.
Мне было интересно, что REGEX должен удостовериться, что строка имеет букву (верхнюю или нижнюю), цифру и специальный символ?
Вот что я знаю до сих пор (чего мало):
if(preg_match('/^[a-zA-Z0-9]+$/i', $string)):
Помогите было бы здорово!
Спасибо!
Самый простой (и, вероятно, лучший) способ – сделать три отдельных проверки с помощью 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
Вы можете использовать положительный lookahead для создания одного регулярного выражения:
$strongPassword = preg_match('/^(?=.*[az])(?=.*[AZ])(?=.*\d)(?=.*[$%^&]).*$/'); // special characters ^^^^
Я нашел отличный ответ здесь с объяснением, чтобы убедиться, что данная строка содержит по крайней мере один символ из каждой из следующих категорий.
Строчный символ, Символ верхнего регистра, Цифра, Символ
^(?=.*[az])(?=.*[AZ])(?=.*\d)(?=.*(_|[^\w])).+$
Краткое объяснение:
^
// начало строки
(?=.*[az])
// используйте положительный взгляд вперед, чтобы увидеть, существует ли хотя бы одна строчная буква
(?=.*[AZ])
// используйте положительный взгляд вперед, чтобы увидеть, существует ли хотя бы одна буква верхнего регистра
(?=.*\d)
// используйте положительный взгляд вперед, чтобы увидеть, существует ли хотя бы одна цифра
(?=.*[_\W])
// используйте положительный взгляд вперед, чтобы увидеть, существует ли хотя бы один символ подчеркивания или не-слова
.+
// собирать всю строку
$
// конец строки
Надеюсь, что тебе помогут.
Лучше всего использовать 3 разных регулярных выражения, поскольку вам нужно будет соответствовать 6 различным возможностям, в зависимости от того, где ваши специальные символы находятся в вашей строке. Но если вы хотите сделать это в одном регулярном выражении, а ваши специальные символы, скажем, [+? @], Возможно:
$string = "abc@123"; $regex = "/^(?=.*[az])(?=.*[AZ])(?=.*\d)(?=.*[$%^&]).*$/" if (preg_match($regex, $string)) { // special characters }
Буква \pL
, число – \pN
а специальный символ – [what you want]
, здесь я предполагаю, что это не буква, а не число, поэтому регулярное выражение выглядит так:
/^(?=.*?\pL)(?=.*?\pN)(?=.*[^\pL\pN])/
False (выбранный ответ выше – Спасибо!) Имел довольно простой способ обернуть вокруг себя голову (если вы не слишком знакомы с регулярным выражением) и придумать то, что работает для вас.
Я просто поставил это для разработки немного:
(вы можете вставить его на http://phptester.net/index.php?lang=en, чтобы работать с ним)
<?php $pass="abc1A"; $ucl = preg_match('/[AZ]/', $pass); // Uppercase Letter $lcl = preg_match('/[az]/', $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..."; } ?>