1

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

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

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

ßab? - Invalid
Ba,-  - Valid

我尝试使用preg_match少量输入但无法完成它。

任何帮助,将不胜感激。

4

2 回答 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;有了它,您可以生成上述模式。

于 2013-03-12T08:23:37.633 回答
0

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

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

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

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

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

于 2013-03-12T07:55:20.147 回答