2014-12-01 85 views
0

是否可以將兩種不同長度的字符串與preg_match匹配?如果是,如何?使用preg_match匹配具有兩種不同固定長度的字符串

我正在尋找的是這樣的:由於

preg_match("/^[a-zA-Z0-9]{13|25}$/", $string); 

,返回真,如果$string拉斯正好無論是13 25個字符的長度。

P.S .:我知道應該是{13,25} - {min,max} - ,但我不感興趣在一個區間內匹配。

回答

1

我知道你的問題是關於用正則表達式來完成的,但通常是儘可能避免使用正則表達式的最佳做法。幾個原因:

  • 你應該基準確定,但在大多數情況下,內置函數將超出正則表達式。
  • 許多編碼器沒有(徹底)理解正則表達式
  • 正則表達式通常不太靈活,只要將新的「業務規則」/要求投入混合。例如,如果你需要在長度爲13的情況下添加一個需要做什麼的事情,如果是25則有什麼不同?或者,如果它是正確的字符但長度錯誤,可以做點什麼?您將無法使用正則表達式編寫這些代碼()我下面介紹的解決方案並沒有解決這些「假設」,但這裏的區別在於您現在有能力根據需要分離這些東西

所以這裏是一個非正則表達式的方法。

if (in_array(strlen($string),array(13,25)) && ctype_alnum($string)) { 
    // good 
} else { 
    // bad 
} 
+0

即使是這樣的特定情況?如果你必須匹配'/^[a-z0-9] */i',但是如果字符串的長度是固定的,我可以看到區別。 – Alex 2014-12-01 16:53:42

+0

@Alex這不是說正則表達式*不能*在你的情況下完成工作,更重要的是是否使用正則表達式的原則和最佳實踐。一般來說,內置函數的性能會更好,一般而言,非正則表達式解決方案更靈活,更易於理解,就其他編碼人員而言,業務需求也會發生變化等。 – 2014-12-01 19:24:06

+0

@Alex不會誤解我的意思..我是一個正則表達式的粉絲。這是完全性感的。但說實話,這是一個超級強大的工具,它的整體用途非常狹窄,從最佳實踐PoV – 2014-12-01 19:25:06

3

這是一個快速的方法:

preg_match('/^[a-zA-Z0-9]{13}([a-zA-Z0-9]{12})?$/', $string); 
相關問題