我想匹配字母和数字,但不仅仅是数字。
所以我想创建一个preg_match()
模式来像这样过滤:
例如:
no123
true 123no
true 123456
false letters
true 答案 0 :(得分:1)
使用SKIP-FAIL模式将胜过Toto的模式(并且MH2K9的答案不正确,因为它不允许所有字母匹配)。您可以在我的演示链接中的示例文本上测试他们的模式。
/^\d+$(*SKIP)(*FAIL)|^[a-z\d]+$/i
这“纯粹”数字字符串“取消资格”,并匹配混合(数字 - 字母)和纯字母字符串。
代码:(Demo)
$string='test123';
var_export(preg_match('/^\d+$(*SKIP)(*FAIL)|^[a-z\d]+$/i',$string)?true:false);
输出:
true
UPDATE:除了正则表达式之外,此任务逻辑可以通过两个非常简单的非正则表达式调用执行:ctype_alnum()和ctype_digit()
代码:(Demo)
$tests = [
'no123', // true
'123no', // true
'123456', // false
'letters', // true
];
foreach ($tests as $test) {
echo "$test evaluates as " , (ctype_alnum($test) && !ctype_digit($test) ? 'true' : 'false') , "\n";
}
输出:
no123 evaluates as true
123no evaluates as true
123456 evaluates as false
letters evaluates as true
答案 1 :(得分:1)
所以我们必须至少有一封信。在它之前可以有任意数量的数字,并允许任何数量的字母数字字符直到字符串的结尾。
/^\d*[a-z][a-z\d]*$/i
^
字符串开头\d*
任意数量的数字[a-z]
一封信[a-z\d]*
任意数量的字母数字字符$
直到字符串结尾i
无标签匹配标志答案 2 :(得分:0)
您可以试试Regex。它会检查数字和字母至少一个。
(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]+)$
答案 3 :(得分:0)
根据你的评论:"只有字母vaild但只有数字无效。",这将完成工作:
if (preg_match('/^(?=.*[a-z])[a-z0-9]+$/i', $inputString)) {
// valid
} else {
// invalid
}
<强>解释强>
/ : regex delimiter
^ : start of string
(?=.*[a-z]) : lookahead, make sure we have at least one letter
[a-z0-9]+ : string contains only letters and numbers
$ : end of string
/i : regex delimiter + flag case insensitive