preg_match模式中的正则表达式不匹配字符串

时间:2017-12-02 05:36:06

标签: php regex pcre

我已阅读PHPManual RegEx Intro,但对如何构建preg_match的模式感到困惑。我正在检查登录表单上的用户名是否为全长小写字母,长度为2到5个字符。

模式1 :最初,我使用了一个字符类,后跟一个重复量词:

if (preg_match("[a-z]{2,5}",$_POST['ULusername'])) {
    $formmessage = 'Hello, ' . $_POST['ULusername'];
} else {
    $formmessage = 'Enter username.';
}

输出始终为“输入用户名。”

模式2 :我想也许我需要分隔符:

if (preg_match("/[a-z]{2,5}/",$_POST['ULusername'])) {
    $formmessage = 'Hello, ' . $_POST['ULusername'];
} else {
    $formmessage = 'Enter username.';
}

但输出仍然总是“输入用户名。”

模式3 :最后,我尝试使用开头/结尾锚定分隔符:

if (preg_match("#^([a-z]{2,5})$#",$_POST['ULusername'])) {
    $formmessage = 'Hello, ' . $_POST['ULusername'];
} else {
    $formmessage = 'Enter username.';
}

这给了我想要的输出。

为什么第三种模式有效,但不是前两种?

2 个答案:

答案 0 :(得分:0)

第一个模式返回false,表示发生了错误(此处,模式中没有分隔符)。

第二种和第三种模式是有效的正则表达式模式,但它们与同一组字符串不匹配。使用"/[a-z]{2,5}/",只要$_POST['ULusername'] 包含至少两个连续的小写字符,您就会匹配。但是,它并不关心整个字符串的长度是否大于5。

最后一个模式都有分隔符和开始和结束锚点,因此只有长度为2到5的小写字符串才匹配。

答案 1 :(得分:0)

  1. 第一个失败,因为它不包含分隔符。
  2. 在第二个问题中,您的逻辑存在问题。因为/[a-z]{2,5}/仅检查两到五个连续的小写字母。而那里没有输入长度的迹象。尝试使用ABcdEF,然后您就会了解那里发生了什么。
  3. 在第三个中,您使用[a-z]{2,5}对此模式()进行了分组,并检查该给定字符串是否以此([a-z]{2,5})组模式开头和结尾。但根据我对你的第三个代码的测试,分组不会影响你的逻辑。不用()试试,你会得到相同的结果。因为当您对逻辑[a-z]{2,5}进行分组并检查给定字符串是否以该组开始和结束时与#^[a-z]{2,5}$#相同。
  4. 有关更多信息,您可以参考有关正则表达式的教程。

    this question: How to use ThreeTenABP in Android Project

    http://www.rexegg.com/regex-quickstart.html