否定特殊字符

时间:2012-10-14 11:42:56

标签: php preg-match

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

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

这会返回无效,这是正确的。然而,到目前为止,我对preg_match的否定感到困惑。有人至少可以对preg_match()的否定进行简要解释吗?而且,我提供给preg_match()的正则表达式是否有任何缺点?

1 个答案:

答案 0 :(得分:2)

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

[abc]将匹配任何a,b或c字母,如您所知。添加^会先取消此设置,因此[^abc]匹配任何 a,b或c的字母,因此匹配d,e,f,g,H ,4,£等等。

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

相关问题