Php 否定特殊字符

Php 否定特殊字符,php,preg-match,Php,Preg Match,我使用preg_match()将一些特殊字符列入黑名单,我的要求是每当字符串包含此类特殊字符时,我都会返回一个无效字符 $str = "adasdasasd*"; if(preg_match('/^[^~`!@#$%\^&\*\(\)]+$/',$str)) { echo "valid"; } else { echo "invalid"; } 这将返回无效的,正确的。然而,到目前为止,我对preg\u match上的否定词感到非常困惑。有人能在preg_match()上至少简单

我使用
preg_match()
将一些特殊字符列入黑名单,我的要求是每当字符串包含此类特殊字符时,我都会返回一个无效字符

$str = "adasdasasd*";
if(preg_match('/^[^~`!@#$%\^&\*\(\)]+$/',$str)) {
  echo "valid";
}
else {
  echo "invalid";
}

这将返回无效的,正确的。然而,到目前为止,我对
preg\u match
上的否定词感到非常困惑。有人能在
preg_match()
上至少简单解释一下否定吗?另外,我提供给
preg\u match()
的正则表达式有什么缺点吗?

好的,所以正则表达式包含一个范围说明符,在本例中,
[^~!@$%\&*\(\)]+
。这有点复杂,现在让我们简化为
[abc]

[abc]
将匹配任何字母a、b或c,您可能知道。添加a
^
首先会否定此集合,因此
[^abc]
匹配任何不是a、b或c的字母,因此将匹配d、e、f、g、H、4等等

在您的情况下,您正在匹配特殊字符列表中没有的任何字符。您的意思是“匹配字符串的开头,然后匹配一个或多个“非特殊”字符,然后匹配字符串的结尾”。如果您有任何特殊字符,它们不能被“非特殊”字符匹配或其他任何东西匹配,因此正则表达式失败