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

问题描述:

我想检测一个字符串是否包含数字和字母。检查一个字符串是否包含数字和字母

例如:

  • 鉴于PncC1KECj4pPVW,就因为它包含两个被写入一个文本文件中。
  • 鉴于qdEQ,它不会,因为它只包含字母。

有没有办法做到这一点?

我试图用

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

但没有奏效。

任何帮助,将不胜感激。

+3

[A-ZA-Z]与A/I改性剂是一种同义反复 – 2012-02-17 21:53:51

+0

@MarkBaker的,因为当你想使_sure_它的东西是不区分大小写:) – 2012-02-17 22:00:33

+2

被允许在字符串中的非字母数字字符? – 2012-02-17 22:26:47

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

回答更新基于https://*.com/a/9336130/315550,日Thnx到https://*.com/users/116286/jb

+22

@Duncan,这只有在字母出现在数字前才有效。不适用于'9877abc'。 – 2012-02-17 21:58:44

+0

非常感谢这些作品,我明白它的工作原理。 – 2012-02-17 21:59:22

+4

这对于'a2'或'A2'也不适用# – 2012-02-17 22:02:37

这工作干净利落:

$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

+0

这适用于字母,然后数字,或数字,然后字母。但是,它允许其他角色(因为你没有说在帖子中排除他们)。 – 2012-02-17 22:05:33

+0

已更新为非字母数字。 – 2012-02-17 22:30:28

+0

您的非字母数字版本让我想要。如果我想要中间的号码怎么办? – 2012-02-17 22:34:43

如果你想匹配只有字母数字字符(也就是说,把字符串视为只要还有其他内容,就像空格或特殊字符一样无效),这应该起作用。

否则,只要删除第一个preg_match()

function myTest($string) 
{ 
    echo "test '".$string."': " 
    . intval(preg_match('/^[a-z\d]+$/i', $string) // has only chars & digits 
     && preg_match('/[a-z]/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 

看来最简单的方法就是在两个正则表达式中完成它。

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

我想另一种方法做到这一点如下。它说“一封信,然后在某个时间点上一个数字(反之亦然)”。但上面的一个更容易阅读IMO。

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

@Downvoter,你能解释一下吗? – 2012-02-17 22:14:03

+0

我没有downvoted,但你的第一个和第二个解决方案将匹配“000 aaaa 111”,我认为这应该被认为是无效的(只有“000aaaa111”等,该字符串不应该包含除字母数字之外的其他字符) - 然而OP没有具体说明“000 aaaa 111”应该被认为是无效的,但是给出的例子表明了这种行为。 – 2012-02-17 22:22:56

+0

@FrostyZ你很对,但问题并不是说它不应该包含其他字符。我以书面形式回答了这个问题。 – 2012-02-17 22:26:08

我唯一的问题是是否必须是一个正则表达式。我会选择两三个(因为你必须建立一个复杂的正则表达式来一次完成。

比方说,你需要有:

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

该easies T和最有效的解决方案:

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"; 
} 

否则,在一个正则表达式,你将不得不考虑几种选择:

  • [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]

加入它变成像一个大的,几乎没有可读的“或运算”正则表达式:

~([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])~ 

当然你可以去(需要只是检查大写和小写时)作者:

preg_match('~([a-z][A-Z]|[a-z][A-Z])~'); 

而且还必须手动检查长度。第二种解决方案看起来相当无效,难以阅读。我的建议:与第一个一起去。

检查字符串是否包含数字或不!

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

如果你需要支持多国语言,从PHP 5.1其它转义序列的字符类型listed here增加。

以下功能利用这一优势,并允许您在多个字母检查字母和数字:

检查任何字母串存在:

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]/ 

它说前几个字符,然后在一些点数。

PHP有一个内置函数。它叫做ctype_alnum

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

这是一个很棒的功能。但是,它不回答OP,因为它只检查字符串是否包含字母或数字。它不验证该字符串是否包含两者。 – butlerblog 2017-10-09 14:11:55