【问题标题】:PHP preg_match expression not matching correct charactersPHP preg_match 表达式不匹配正确的字符
【发布时间】:2013-12-09 18:27:07
【问题描述】:

我正在尝试捕捉任何不是字母、数字或 .-_(句点、破折号、下划线)的字符

我的代码是

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

我希望它在找到无效字符时返回 false。截至目前,它允许 ._(句点和下划线)但不允许 -(破折号)。它也不会将 /、\、[、]、%、^ 等字符检测为无效字符。

我的表达有什么问题?

【问题讨论】:

    标签: php regex validation preg-match


    【解决方案1】:

    在正则表达式字符类中,您不能匹配文字连字符,除非它是:

    1. 立即对着任一括号,
    2. 跟随否定插入符号 (^),或
    3. 使用反斜杠 (\) 进行转义

    连字符可以在左括号之后,右括号之前,或者在否定插入符号之后。 [-x] 和 [x-] 都匹配 x 或连字符。 [^-x] 和 [^x-] 匹配任何不是 x 或连字符的字符。这适用于本教程中讨论的所有风格。在字符类中不能形成范围的其他位置的连字符可能会被解释为文字或错误。正则表达式风格对此非常不一致。

    Source - 参见字符类中的元字符

    【讨论】:

    • 立即反对括号或否定插入符号不是唯一的解决方案。 +1 如果您在答案中添加转义;-)
    【解决方案2】:

    只需避开破折号:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-16
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      相关资源
      最近更新 更多