Я хочу определить, содержит ли строка как числа, так и буквы.
Например:
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
Самое простое и эффективное решение:
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]/
Он говорит о первых символах, а затем о некоторых точках.