与正则表达式PHP斗争?

与正则表达式PHP斗争?,php,regex,preg-match,Php,Regex,Preg Match,我试图在PHP中放置一个正则表达式匹配项,以查找字符串是否包含除以下字符以外的任何其他无效字符 ~!@#$%^&*()_-+=\}]{[::'"/>.<, alpha, space, numeric 我尝试使用preg_match,输入很少,但无法完成 任何帮助都将不胜感激。下面的正则表达式将匹配包含特殊字符、字母、空格和数字的任何字符串 /^[\s\w~!@#$%^&*()+=\}\]{\[:'"\/>.<,-]*$/ /^[\s\w~!@$%^&*

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

~!@#$%^&*()_-+=\}]{[::'"/>.<,
alpha, space, numeric
我尝试使用
preg_match
,输入很少,但无法完成


任何帮助都将不胜感激。

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

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

/^[\s\w~!@$%^&*()+=\}\]{\[:'“\/>。更新

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

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

if (preg_match("/[^$valid\d\sA-Za-z]/", $invalid)) {
        echo "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='~!@$%^&*(-+=\}]{[::\“/>。您忘记了在有效字符列表中转义
/
。应该是
\/
,否则它将不起作用。它在“\\”位置显示错误?问题在哪里?我们也不需要转义吗?@user1518659我不知道php及其转义序列。但它确实起作用(一名在线php正则表达式测试人员)我认为您还需要转义
-
字符,因为这意味着字符的“范围”。还必须转义单引号或双引号。这与反斜杠
`也不匹配。请使用此正则表达式尝试:
/^[\s\w~!@$%^&*+=\}{[:\''\/>。当我插入时,正则表达式似乎失败numbers@w00你能举个例子吗?@w00真有趣。我误读了我的计算器:)fixed.0x36而不是0x3b+1,尽管…@user1518659 FYI:
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);