我试图在 PHP 中进行正则表达式匹配,以查找字符串是否包含除以下字符之外的任何其他无效字符,
~!@#$%^&*()_-+=\}]{[::'"/>.<,
alpha, space, numeric
如果字符串包含除前面提到的字符之外的任何其他字符,我想打印该字符串
ßab? - Invalid
Ba,- - Valid
我尝试使用
preg_match()
进行少量输入,但无法完成。
更新
此表达式将与您的有效范围的负集匹配:
$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
内的序数字符代码数组;这样你就可以生成上面的图案。
下面的正则表达式将匹配任何包含特殊字符、字母、空格、数字的字符串..
/^[\s\w~!@#$%^&*()+=\}\]{\[:'"\/>.<,-]*$/
^
是字符串的开头..$
是字符串的结尾..^
,$
是必需的,因为它们将与输入完全匹配而不是部分
[]
是一个字符类,它将匹配其中的任何 one 字符..
*
是一个量词,它将匹配前面的字符、组或字符类 0 到多次 次..