我需要一个正则表达式只接受包含字母和数字字符的字符串。例如:
ABCDEF: wrong
123456: wrong
!##$%@.: wrong
ABCD123!@$: wrong
ABC12389IKEIIJ29: **correct**
我该如何使用PHP?
答案 0 :(得分:0)
preg_match('/^[0-9A-Z]*([0-9][A-Z]|[A-Z][0-9])[0-9A-Z]*$/', $subject);
如果您想允许小写和大写字母,请在模式字符串的末尾添加i
。
说明:
[0-9][A-Z]
匹配一个数字后跟一个大写字母
[A-Z][0-9]
匹配一个大写字母后跟一位数
([0-9][A-Z]|[A-Z][0-9])
匹配这两个序列中的一个
[0-9A-Z]*
匹配0-n数字和/或大写字母
这个想法是:包含(和仅),字母和数字的字符串,至少有一个子序列,其中字母跟随数字或数字跟随字母。所有其他字符(前后)必须是数字或字母。
答案 1 :(得分:0)
我觉得最专业,最容易理解的方法是声明两个先行字符,分别要求一定范围的字符,然后匹配一个或多个满足两组白名单字符的字符-当然,所有这些逻辑需要嵌套在字符串的开头和字符串锚的末尾。
我将在将preg_grep()
应用于测试字符串数组的情况下进行演示,但是您可以在单个字符串上对preg_match()
使用相同的模式。
代码:(Demo)
$tests = [
'ABCDEF',
'123456',
'9Z',
'!##$%@.',
'ABCD123!@$',
'ABC12389IKEIIJ29',
];
var_export(
preg_grep(
'~^(?=.*[A-Z])(?=.*\d)[A-Z\d]+$~',
$tests
)
);
输出:(限定字符串数组)
array (
2 => '9Z',
5 => 'ABC12389IKEIIJ29',
)