检查字符串是否包含数字和字母

Dun*_*mer 32 php

我想检测字符串是否包含数字和字母.

例如:

  • 给定PncC1KECj4pPVW,它将被写入文本文件,因为它包含两者.
  • 鉴于qdEQ,它不会,因为它只包含字母.

有没有办法做到这一点?

我试图用

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

但它没有用.

任何帮助,将不胜感激.

jb.*_*jb. 52

似乎最简单的方法就是在两个正则表达式中做到这一点.

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

我想另一种方法是在下面这样做.它写着"一封信,然后在某个时刻点上一个数字(反之亦然)".但上面的那个更容易阅读IMO.

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


Moh*_*aji 26

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

答案根据/sf/answers/653529131/更新,thnx到/sf/users/8140051/

  • @Duncan,只有在数字前面有字母时才会有效.不适用于`9877abc`. (24认同)
  • @MohammadNaji如果你更喜欢别人的答案,因为人们已经指出了你的一个缺陷,为什么不改善你自己?特别是考虑到它是公认的. (8认同)
  • 哇,这个答案太糟糕了. (7认同)

Jon*_*n M 8

这很干净:

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

要查看它的实际效果,请将其复制并粘贴到此处:http://phptester.net/index.php?lang = en


Vyk*_*tor 7

我唯一的问题是,是否必须是一个正则表达式.我会选择两到三个(因为你必须建立一个复杂的正则表达式才能立刻完成它.

假设您需要:

  • 至少一个大写字符 [A-Z]
  • 至少一个小写字符 [a-z]
  • 至少一个号码 \d
  • 密码至少7个字符

最简单,最有效的解决方案:

if( preg_match( '~[A-Z]~', $password) &&
    preg_match( '~[a-z]~', $password) &&
    preg_match( '~\d~', $password) &&
    (strlen( $password) > 6)){
    echo "Good password";
} else {
    echo "Not so much";
}
Run Code Online (Sandbox Code Playgroud)

否则,在一个正则表达式中,您将不得不考虑几个选项:

  • [a-z][A-Z]+\d
  • [a-z]\d+[A-Z]
  • [A-Z][a-z]+\d
  • [A-Z]\d+[a-z]
  • \d[a-z]+[A-Z]
  • \d[A-Z]+[a-z]

加入一个大而难以读取的"ored"正则表达式:

~([a-z][A-Z]+\d|[a-z]\d+[A-Z]|[A-Z][a-z]+\d|[A-Z]\d+[a-z]|\d[a-z]+[A-Z]|\d[A-Z]+[a-z])~
Run Code Online (Sandbox Code Playgroud)

当然你可以去(当需要检查大小写时):

preg_match( '~([a-z][A-Z]|[a-z][A-Z])~');
Run Code Online (Sandbox Code Playgroud)

并且仍然需要手动检查长度.第二个解决方案似乎非常无效,很难读给我看.我的建议:跟第一个一起去.


Kri*_*rii 6

PHP有一个内置函数.它被称为ctype_alnum.

if(!ctype_alnum($string)) {
  return $error;
}
// Continue on your way...
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很棒的功能。但是,它不回答 OP,因为它只检查字符串是否包含字母或数字。它不会验证字符串是否包含两者。 (2认同)