我正在PHP中編寫一個應用程序,需要測試字段以獲得正確的代金券代碼。憑證條目可以是三種模式中的一種。我不擅長表情,所以希望能從這裏的一些專家那裏得到一些幫助。幾種模式的preg_match
的三種模式爲: 1000150000(任何10位) 12345678(任意8位) 3JFK-TAB-CDEFG(初現貨數,其餘的α帶或不帶連字符。)
I」我想,因爲三張憑證條目如此不同,可能需要在三個不同的IF語句中完成。
感謝您的任何/所有幫助! Rick
我正在PHP中編寫一個應用程序,需要測試字段以獲得正確的代金券代碼。憑證條目可以是三種模式中的一種。我不擅長表情,所以希望能從這裏的一些專家那裏得到一些幫助。幾種模式的preg_match
的三種模式爲: 1000150000(任何10位) 12345678(任意8位) 3JFK-TAB-CDEFG(初現貨數,其餘的α帶或不帶連字符。)
I」我想,因爲三張憑證條目如此不同,可能需要在三個不同的IF語句中完成。
感謝您的任何/所有幫助! Rick
或者您可以使用替代。也就是說,寫出三個正則表達式,並用|將它們串起來符號含義「匹配其中之一」。
所以
/[^...$]|\d|Z$/
(即三個字符或包含許多或Z.結束)
(\d{10})?(\d{8})?(\d[a-zA-Z-]+)?
這創建三個任選的基團,1-3個,將捕獲任何10數字(組1),任何8位數字(組2)或數字後跟字母,帶或不帶連字符(組3)。
以下是關於regex101的the expression的鏈接。
我想你會想添加字符串斷言的開始和結束('^'和'$')。否則'hello1000150000'實際上會是一場比賽。 – MElliott
我並不反對,但不清楚這個要求是什麼,所以我放棄了這個想法,如果有必要,它可能會受到限制。 – binarysubstrate
很酷。只是想我會提到。 :) – MElliott
您可以使用此:
/^[0-9](?:[0-9]{7}(?:[0-9]{2})?|[A-Z]*(?>-[A-Z]+)*)$/
這種模式的主要興趣是:
個9ABCD-EFGH-
(即用連字符共完成)這太複雜了。性能不是一個合理的問題,除了[MElliott](http://stackoverflow.com/a/21920046/20938)所建議的簡單替換之外,沒有其他理由可以選擇這種方式。 (關於沒有尾隨連字符的部分可能是有效的,但是這個要求在問題中沒有提到。)另外,你的括號是不平衡的。 –
@AlanMoore:感謝指出不平衡的羣體。 「太複雜」只是心靈的幻想。很高興你注意到像「1 ------------------ AAAAAAAAAAAAAA ----------」這樣的字符串是不允許的。 –
我不是正則表達式的專家,但我會假設,覆蓋3個模式中的一個大的正則表達式完成同樣具有3種不同驗證。據說,爲了更好的可讀性和代碼模塊化,我將親自分成3個不同的驗證。 –