0

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

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

这将返回invalid,这是正确的。但是,到目前为止,我对这个否定感到很困惑preg_match。有人可以至少简要解释一下 negate onpreg_match()吗?而且,我提供的正则表达式preg_match()有什么缺点吗?

4

1 回答 1

2

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

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

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

于 2012-10-14T11:45:21.300 回答