Проверьте, содержит ли строка цифры и буквы

Я хочу определить, содержит ли строка как числа, так и буквы.

Например:

  • Учитывая PncC1KECj4pPVW , он будет записан в текстовый файл, потому что он содержит оба.
  • Учитывая qdEQ , это не так, потому что оно содержит только буквы.

Есть ли способ сделать это?

Я пытался использовать

 $string = PREG_REPLACE("/[^0-9a-zA-Z]/i", '', $buffer); 

Но это не сработало.

Любая помощь будет оценена по достоинству.

 if (preg_match('/[A-Za-z].*[0-9]|[0-9].*[A-Za-z]/', $myString)) { echo 'Secure enough'; } 

Ответ обновлен на основе https://stackoverflow.com/a/9336130/315550 , thnx – https://stackoverflow.com/users/116286/jb

Кажется, самый простой способ – просто сделать это в двух регулярных выражениях.

 if (preg_match('/[A-Za-z]/', $myString) && preg_match('/[0-9]/', $myString)) { echo 'Contains at least one letter and one number'; } 

Я полагаю, что это еще один способ сделать это. В нем говорится «письмо, а затем в какой-то момент число (или наоборот)». Но выше, чем легче читать ИМО.

 if (preg_match('/[A-Za-z].*[0-9]|[0-9].*[A-Za-z]/', $myString)) { echo 'Contains at least one letter and one number'; } 

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

Предположим, что вам нужно:

  • по крайней мере один символ верхнего регистра [AZ]
  • по крайней мере, один строчный символ [az]
  • хотя бы одно число \d
  • иметь пароль длиной не менее 7 символов

Самое простое и эффективное решение:

 if( preg_match( '~[AZ]~', $password) && preg_match( '~[az]~', $password) && preg_match( '~\d~', $password) && (strlen( $password) > 6)){ echo "Good password"; } else { echo "Not so much"; } 

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

  • [az][AZ]+\d
  • [az]\d+[AZ]
  • [AZ][az]+\d
  • [AZ]\d+[az]
  • \d[az]+[AZ]
  • \d[AZ]+[az]

Присоедините его к одному большому и едва читаемому регулярному выражению «ored»:

 ~([az][AZ]+\d|[az]\d+[AZ]|[AZ][az]+\d|[AZ]\d+[az]|\d[az]+[AZ]|\d[AZ]+[az])~ 

Конечно, вы можете пойти (когда нужно просто проверить верхний и нижний регистр):

 preg_match( '~([az][AZ]|[az][AZ])~'); 

И еще нужно проверить длину вручную. Второе решение кажется довольно неэффективным и трудночитаемым для меня. Моя рекомендация: идти первым.

Это работает чисто:

 $myString="abc123"; if( preg_match('([a-zA-Z].*[0-9]|[0-9].*[a-zA-Z])', $myString) ) { echo('Has numbers and letters.'); } else { echo("no"); } - $myString="abc123"; if( preg_match('([a-zA-Z].*[0-9]|[0-9].*[a-zA-Z])', $myString) ) { echo('Has numbers and letters.'); } else { echo("no"); } 

Чтобы увидеть его в действии, скопируйте его и вставьте здесь: http://phptester.net/index.php?lang=en

Для этого PHP имеет встроенную функцию. Он называется ctype_alnum .

 if(!ctype_alnum($string)) { return $error; } // Continue on your way... 

Если вы хотите сопоставить только буквенно-цифровые символы (то есть считайте строку недействительной, как только в ней что-то еще, например пробелы или специальные символы), это должно работать.

В противном случае просто удалите первый preg_match() .

 function myTest($string) { echo "test '".$string."': " . intval(preg_match('/^[az\d]+$/i', $string) // has only chars & digits && preg_match('/[az]/i', $string) // has at least one char && preg_match('/\d/', $string)) // has at least one digit . "\n"; } myTest('aAa'); // => 0 myTest('111'); // => 0 myTest('aAa111bbb'); // => 1 myTest('111aAabbb'); // => 1 myTest('aAabbb111'); // => 1 myTest('111bBb222'); // => 1 myTest('111 bBb 222'); // => 0 myTest('$$$$'); // => 0 

для проверки, содержит ли строка номера или нет!

 function ContainsNumbers($String){ return preg_match('/\\d/', $String) > 0; } 

Если вам нужно поддерживать несколько языков, из PHP 5.1 были добавлены дополнительные escape-последовательности для типов символов, перечисленных здесь .

Следующие функции воспользуются этим и позволяют проверять буквы и цифры в нескольких алфавитах:

проверьте, существует ли буква в строке:

 function has_letter($x){ if (preg_match("/[\p{L}]/u",$x)) { return true; } return false; } 

строка проверки содержит любое число

 function has_number($x) { if (preg_match("/[\p{N}]/u",$x)) { return true; } return false; } 

Применение

 $string = '123اختبا'; has_letter($string); // true $string = '೪౨౨'; has_number($string); // true 

Оба вместе в соответствии с запросами

 $string='I am 28'; if (has_letter($string)&&has_number($string)){ // true } $string='I am ౨೩೫'; if (has_letter($string)&&has_number($string)){ // true } $string='Привет, друг, как ты?'; has_number($string); // false - this Russian text doesn't contain a number 

Вот несколько рекомендаций ниже:

Проблема: не проверяется на цифре внутри строки. Например,

  OM 4 OM, OM4OM , space OM 4 OM space, space OM4OM space. -----> No valdation over this?? 

Решение:

 if (preg_match("/[A-Za-z].*[0-9]/",$_POST["name"])) { header("location:http://localhost/Test1.html"); exit; } Logic: /[A-Za-z].*[0-9]/ 

Он говорит о первых символах, а затем о некоторых точках.