簡體   English   中英

preg_match模式中的正則表達式不匹配字符串

[英]Regular expressions in preg_match pattern not matching string

我已經閱讀了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.';
}

這給了我想要的輸出。

為什么第三個模式有效,但前兩個模式無效?

第一個模式返回false,表示發生了錯誤(此處,模式中沒有定界符)。

第二個和第三個模式是有效的正則表達式模式,但它們與同一組字符串不匹配。 只要$_POST['ULusername']至少包含兩個連續的小寫字符,使用"/[az]{2,5}/"就可以匹配。 但是,它並不關心整個字符串的長度是否大於5。

最后一個模式都有定界符以及開始和結束錨點 ,因此只有長度為2到5的小寫字符串會匹配。

  1. 第一個失敗,因為它不包含定界符。
  2. 在第二篇中,您的邏輯存在問題。 因為/[az]{2,5}/僅檢查2至5個連續的小寫字母。 並且在那里沒有輸入長度的指示。 嘗試使用ABcdEF ,然后您將了解發生了什么。
  3. 在第三個[az]{2,5} ,您使用()這個模式[az]{2,5}進行了分組,並檢查給定的字符串是否以此([az]{2,5})組模式開始和結束。 但是根據我對您的第三個代碼的測試,分組不會影響您的邏輯。 不帶()嘗試,您將獲得相同的結果。 因為當您對邏輯[az]{2,5}分組並檢查給定字符串是否以該組開始和結束時,與#^[az]{2,5}$#

有關更多信息,您可以參考有關正則表達式的教程。

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

https://www.regular-expressions.info/refcapture.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM