PHP preg_match表达式与正确的字符不匹配


PHP preg_match expression not matching correct characters

我试图捕获任何不是字母、数字或.-_的字符(句点、短划线、下划线)

我的代码是

return !preg_match('/[^A-Za-z0-9.-_]/', $strToFilter);

我希望它在发现无效字符时返回false。截至目前允许。_(句点和下划线),但不允许使用-(短划线)。它也不会将/、''、[、]、%、^等字符检测为无效字符。

我的表情怎么了?

在Regex字符类中,不能匹配文字连字符,除非它是:

  1. 紧靠任一支架
  2. 在否定插入符号(^)之后,或者
  3. 使用反斜杠(')进行转义

连字符可以包含在左括号的正后方,也可以包含在右括号的正前方,或者包含在否定插入符号的正后方。[-x]和[x-]都与x或连字符匹配。[^-x]和[^x-]匹配任何不是x或连字符的字符。这适用于本教程中讨论的所有风格。字符类中不能形成范围的其他位置的连字符可能被解释为文字或错误。Regex的口味在这方面很不一致。

来源-请参阅字符类内的元字符

只需跳过破折号:

return !preg_match('/[^A-Za-z0-9.'-_]/', $strToFilter);