2014-02-20 42 views
0

我正在PHP中編寫一個應用程序,需要測試字段以獲得正確的代金券代碼。憑證條目可以是三種模式中的一種。我不擅長表情,所以希望能從這裏的一些專家那裏得到一些幫助。幾種模式的preg_match

的三種模式爲: 1000150000(任何10位) 12345678(任意8位) 3JFK-TAB-CDEFG(初現貨數,其餘的α帶或不帶連字符。)

I」我想,因爲三張憑證條目如此不同,可能需要在三個不同的IF語句中完成。

感謝您的任何/所有幫助! Rick

+0

我不是正則表達式的專家,但我會假設,覆蓋3個模式中的一個大的正則表達式完成同樣具有3種不同驗證。據說,爲了更好的可讀性和代碼模塊化,我將親自分成3個不同的驗證。 –

回答

4

你可以這樣做:

(^\d{10}$|^\d{8}$|^\d[A-Za-z-]+$) 

工作正則表達式的例子:

http://regex101.com/r/uI9dU0

+0

因此,如下所示:if(!preg_match(「^ \ d {10} $ |^\ d {8} $ |^\ d [A-Za-z-] + $」,$ voucher)){echo「不匹配「; }? – Rick

+0

@瑞克,是的。而已。 :) – MElliott

+0

還有一個問題。上面的例子中的第三個匹配似乎適用於任何長度的字符串。我如何修改它只匹配12或14個字符長度? 14連字符或12無。 – Rick

-1

或者您可以使用替代。也就是說,寫出三個正則表達式,並用|將它們串起來符號含義「匹配其中之一」。

所以

/[^...$]|\d|Z$/ 

(即三個字符或包含許多或Z.結束)

0

(\d{10})?(\d{8})?(\d[a-zA-Z-]+)?

這創建三個任選的基團,1-3個,將捕獲任何10數字(組1),任何8位數字(組2)或數字後跟字母,帶或不帶連字符(組3)。

以下是關於regex101的the expression的鏈接。

+0

我想你會想添加字符串斷言的開始和結束('^'和'$')。否則'hello1000150000'實際上會是一場比賽。 – MElliott

+1

我並不反對,但不清楚這個要求是什麼,所以我放棄了這個想法,如果有必要,它可能會受到限制。 – binarysubstrate

+0

很酷。只是想我會提到。 :) – MElliott

0

您可以使用此:

/^[0-9](?:[0-9]{7}(?:[0-9]{2})?|[A-Z]*(?>-[A-Z]+)*)$/ 

這種模式的主要興趣是:

  • 避免串像這樣:9ABCD-EFGH-(即用連字符共完成)
  • 不通過使2個末尾數字可選重試所有的數字。 (而不是使用交替)
  • 嘗試僅匹配第一個數字一次。 (圖案立刻失敗,如果第一個字符是不是數字。)
+0

這太複雜了。性能不是一個合理的問題,除了[MElliott](http://stackoverflow.com/a/21920046/20938)所建議的簡單替換之外,沒有其他理由可以選擇這種方式。 (關於沒有尾隨連字符的部分可能是有效的,但是這個要求在問題中沒有提到。)另外,你的括號是不平衡的。 –

+0

@AlanMoore:感謝指出不平衡的羣體。 「太複雜」只是心靈的幻想。很高興你注意到像「1 ------------------ AAAAAAAAAAAAAA ----------」這樣的字符串是不允許的。 –