[英]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的小寫字符串會匹配。
/[az]{2,5}/
僅檢查2至5個連續的小寫字母。 並且在那里沒有輸入長度的指示。 嘗試使用ABcdEF
,然后您將了解發生了什么。 [az]{2,5}
,您使用()
這個模式[az]{2,5}
進行了分組,並檢查給定的字符串是否以此([az]{2,5})
組模式開始和結束。 但是根據我對您的第三個代碼的測試,分組不會影響您的邏輯。 不帶()
嘗試,您將獲得相同的結果。 因為當您對邏輯[az]{2,5}
分組並檢查給定字符串是否以該組開始和結束時,與#^[az]{2,5}$#
。 有關更多信息,您可以參考有關正則表達式的教程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.