【问题标题】:I can't get preg_match to test if the entire string matches the regex我无法让 preg_match 测试整个字符串是否与正则表达式匹配
【发布时间】:2014-05-02 12:39:09
【问题描述】:

我正在使用这个正则表达式来测试用户名是否有效:

[A-Za-z0-9 _]{3,12} 当我在文本编辑器中使用字符串test'ing 对其匹配进行测试时,它会突出显示“test”和“ing”,但是当我在 PHP 中使用以下代码时:

if(!preg_match('/[A-Za-z0-9 _]{3,12}/', $content) 其中 $content 是 test'ing,它应该返回 FALSE,它仍然返回 true。

我的正则表达式有问题吗?我需要:

  • 最小长度 3,最大 12 {3,12}
  • 字符串前后没有空格/下划线,任何地方都没有空格/下划线 (我为此使用了额外的检查,因为我不太擅长正则表达式)
  • 只允许使用字母数字、空格和下划线[A-Za-z0-9 _]

提前谢谢...

【问题讨论】:

    标签: php regex preg-match


    【解决方案1】:

    您缺少正则表达式中的锚点,因此正则表达式可以轻松匹配字符串中字符类 anywhere 中的 3 个字符。这不是你想要的。您想检查您的正则表达式是否与整个字符串匹配。为此,您需要包含锚点(^$)。

    if(!preg_match('/^[A-Za-z0-9 _]{3,12}$/', $content)
                     ^                   ^
    

    ^ 断言字符串开头的位置,$ 断言字符串末尾的位置。需要注意的是,这些元字符实际上并不消耗字符。它们是零宽度断言。

    进一步阅读:

    【讨论】:

    • 糟糕,同步发布;对此感到抱歉:(
    • @Piskvor:哈,发生了。不用担心。 (我通常会等待 5 分钟的宽限期结束后再进行任何编辑。:)
    • 谢谢,很好的解释!你能帮我检查一下字符串开头和结尾的空格和下划线吗?
    【解决方案2】:

    您应该添加开始和结束锚点 (^$):

    if(!preg_match('/^[A-Za-z0-9 _]{3,12}$/', $content)
    

    锚点^ 匹配字符串的开头,$ 匹配结尾。这样,只有当 whole 字符串满足您的正则表达式时,它才会匹配。

    希望有帮助

    【讨论】:

    • @AmitJoki,哈哈,今天不行,已经刷爆了,真的很累。明天也许:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 2017-09-26
    • 2012-06-11
    相关资源
    最近更新 更多