Как проверить, имеет ли строка хотя бы одну букву, номер и специальный символ в php

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

Мне было интересно, что 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..."; } ?>