检查一个字符串是否包含数字和字母
我想检测一个字符串是否包含数字和字母。检查一个字符串是否包含数字和字母
例如:
- 鉴于
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://*.com/a/9336130/315550,日Thnx到https://*.com/users/116286/jb
@Duncan,这只有在字母出现在数字前才有效。不适用于'9877abc'。 – 2012-02-17 21:58:44
非常感谢这些作品,我明白它的工作原理。 – 2012-02-17 21:59:22
这对于'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
这适用于字母,然后数字,或数字,然后字母。但是,它允许其他角色(因为你没有说在帖子中排除他们)。 – 2012-02-17 22:05:33
已更新为非字母数字。 – 2012-02-17 22:30:28
您的非字母数字版本让我想要。如果我想要中间的号码怎么办? – 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';
}
@Downvoter,你能解释一下吗? – 2012-02-17 22:14:03
我没有downvoted,但你的第一个和第二个解决方案将匹配“000 aaaa 111”,我认为这应该被认为是无效的(只有“000aaaa111”等,该字符串不应该包含除字母数字之外的其他字符) - 然而OP没有具体说明“000 aaaa 111”应该被认为是无效的,但是给出的例子表明了这种行为。 – 2012-02-17 22:22:56
@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...
这是一个很棒的功能。但是,它不回答OP,因为它只检查字符串是否包含字母或数字。它不验证该字符串是否包含两者。 – butlerblog 2017-10-09 14:11:55
[A-ZA-Z]与A/I改性剂是一种同义反复 – 2012-02-17 21:53:51
@MarkBaker的,因为当你想使_sure_它的东西是不区分大小写:) – 2012-02-17 22:00:33
被允许在字符串中的非字母数字字符? – 2012-02-17 22:26:47