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

问题描述 投票:-3回答:2

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

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

如何使用PHP?

php regex
2个回答
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个数字和/或大写字母

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


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',
)
© www.soinside.com 2019 - 2024. All rights reserved.