這個問題在這里已經有了答案: 方括號內的交替運算子不起作用 (2個答案) 11 小時前關閉。
我嘗試為 SQLorder by子句實作一個驗證器,我有這個運算式
$expression = '/^(([a-z]|[A-Z]|[0-9]|\.|_) ([\s]) ([desc|asc]){1})/i'
如果我們檢查preg_match($expression, $value),那么它可以正常作業。現在,我想確保該值以ascor結尾desc。但
$expression = '/^(([a-z]|[A-Z]|[0-9]|\.|_) ([\s]) ([desc|asc]){1}$)/i'
失敗abc4a ASC或"4abc4\n\r desc"。相同的運算式沒有被$認為是有效的。為什么字串以descor結尾asc并且我的正則運算式發現它們無效,除非我洗掉$符號?
uj5u.com熱心網友回復:
[...]在正則運算式中稱為字符類。它匹配一個字符,該類中的任何字符。這意味著[asc]匹配一個a,s或者c只匹配一個字符,而不是整個字串asc。
該片段[desc|asc]匹配d, e, s, c, |, a, sor中的一個字符c。它等效于[acdes|](字符類中的字符可以按任意順序列出,重復項被忽略)。
你的正則運算式應該是:
$expression = '/^(([a-z]|[A-Z]|[0-9]|\.|_) ([\s]) (desc|asc){1}$)/i'
它可以被簡化和修正。{1}是多余的。這意味著前一塊恰好一次,但這是默認值。{1}可以隨時洗掉。
[a-z]|[A-Z]表示a, b... z(小寫字符)或A, B... Z(大寫字符)串列中的一個字符。兩個范圍(以及可以出現在正則運算式中該位置的其他范圍和字符)都可以組合成一個類:[a-zA-Z0-9._]
[\s]表示其中一種\或s可能不是您想要的。您可能想要一個或多個空格字符(\s是一個特殊序列,表示空格字符)。
除了周圍的那些desc|asc,不需要括號(除非你想捕獲匹配的字串)。
總而言之,您的正則運算式應該是:
$expression = '/^[a-zA-Z0-9._] \s (desc|asc)$/i';
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/389355.html
