验证字符串仅包含白名单字符

问题描述 投票:0回答:2

我试图在 PHP 中进行正则表达式匹配,以查找字符串是否包含除以下字符之外的任何其他无效字符,

~!@#$%^&*()_-+=\}]{[::'"/>.<,
alpha, space, numeric

如果字符串包含除前面提到的字符之外的任何其他字符,我想打印该字符串

ßab? - Invalid
Ba,-  - Valid

我尝试使用

preg_match()
进行少量输入,但无法完成。

php regex validation preg-match whitelist
2个回答
3
投票

更新

此表达式将与您的有效范围的负集匹配:

$valid = preg_quote('~!@#$%^&*()_-+=\}]{[::\'"/>.<,', '/');

if (preg_match("/[^$valid\d\sA-Za-z]/", $invalid)) {
        echo "invalid chars\n";
}

我在这里使用

preg_quote()
来确保所有字符都正确转义。

旧答案

我根据你的问题计算了负集:

if (preg_match('/[\x00-\x08\x0c\x0e-\x1f\x3b\x3f\x60\x7c\x7f-\xff]/', $str)) {
        echo "matches invalid chars\n";
}

要获得此集合,您可以使用以下代码:

$s = '~!@#$%^&*()_-+=\}]{[::\'"/>.<,'
        . join('', range('a', 'z'))
        . join('', range('A', 'Z'))
        . join('', range('0', '9'))
        . " \t\r\v\n";

$missing = count_chars($s, 2);
print_r($missing);

它打印不在

$s
内的序数字符代码数组;这样你就可以生成上面的图案。


0
投票

下面的正则表达式将匹配任何包含特殊字符、字母、空格、数字的字符串..

/^[\s\w~!@#$%^&*()+=\}\]{\[:'"\/>.<,-]*$/

^
是字符串的开头..
$
是字符串的结尾..
^
,
$
是必需的,因为它们将与输入完全匹配而不是部分

[]
是一个字符类,它将匹配其中的任何 one 字符..

*
是一个量词,它将匹配前面的字符、组或字符类 0 到多次 次..

© www.soinside.com 2019 - 2024. All rights reserved.