如何使用preg_match只允许包含字母和数字字符的字符串


How to use preg_match to only allow strings containing alphabetic and numeric characters?

我需要一个正则表达式来只接受同时包含字母和数字字符的字符串。例如:

ABCDEF: wrong 
123456: wrong
!##$%@.: wrong
ABCD123!@$: wrong
ABC12389IKEIIJ29: **correct**

我该如何使用PHP?

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位数字和/或大写字母

其思想是:一个同时包含(且仅包含)字母和数字的字符串,至少有一个子序列,其中字母跟在数字后面或数字跟在字母后面。所有其他字符(前面和后面)都必须是数字或字母。

我觉得最专业、最容易理解的方法是声明两个单独需要特定字符范围的lookahead,然后匹配一个或多个满足两组白名单字符的字符——当然,所有这些逻辑都需要嵌套在字符串起始和字符串结束锚中。

我将演示将preg_grep()应用于测试字符串数组,但您可以在单个字符串上使用preg_match()的相同模式。

代码:(演示)

$tests = [
    'ABCDEF',
    '123456',
    '9Z',
    '!##$%@.',
    'ABCD123!@$',
    'ABC12389IKEIIJ29',
];
var_export(
    preg_grep(
        '~^(?=.*[A-Z])(?=.*'d)[A-Z'd]+$~',
        $tests
    )
);

输出:(合格字符串数组)

array (
  2 => '9Z',
  5 => 'ABC12389IKEIIJ29',
)