2013-02-18 63 views
1

我的正則表達式知識不是最好的,雖然我一直在尋找通過帖子來讓我的頭周圍,我無法找到我在找什麼。preg_match正則表達式所需的特定英國郵政區號

我想用以下(其中$郵編是由用戶輸入完整的郵政編碼):

if(preg_match("AREA CODE REGEX GOES HERE", $postcode)) 
{ 
    //Do something 
} 

做到以下幾點:

檢查哪裏郵編區號進入比賽之一以下DN15,16,17,18,19,20,21,22,31,32,33,34,35,36,37,38,39,40,41(全DN)。

所以我正在尋找正則表達式來匹配那些郵編。例如,它可以是DN21 1AB或DN21 2AB,但它必須與DN21的第一部分相匹配。

我希望這是足夠的信息,並提前感謝您的幫助。

+0

翻翻帖子和搜索谷歌通常並不像檢查爲好[手冊](http://www.php.net/manual/en/reference.pcre.pattern.syntax.php)。你必須遲早做;-) – 2013-02-18 11:19:56

回答

8

試試這個正則表達式模式,由英國政府本身提供:

(GIR 0AA)|((([A-Z-[QVX]][0-9][0-9]?)|(([A-Z-[QVX]][A-Z-[IJZ]][0-9][0-9]?)|(([A-Z-[QVX]][0-9][A-HJKSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY])))) [0-9][A-Z-[CIKMOV]]{2}) 

所以將它應用到你的情況,你可以先檢查你正在處理一個有效的英國郵政編碼,然後檢查如果第一部分與「DN」開始,並且第二部分是接受號碼陣列中的範圍中的任何一個:

$accepted_numbers = array_merge(range(15, 22), range(31, 41)); 

if (preg_match('#^(GIR ?0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]([0-9ABEHMNPRV-Y])?)|[0-9][A-HJKPS-UW]) ?[0-9][ABD-HJLNP-UW-Z]{2})$#', $postcode) && substr($postcode, 0, 2) == 'DN' && in_array(substr($postcode, 2, 2), $accepted_numbers)) { 
     // The UK post code is valid according to your criteria 
} 

來源:http://webarchive.nationalarchives.gov.uk/+/http://www.cabinetoffice.gov.uk/media/254290/GDS%20Catalogue%20Vol%202.pdf(第11頁)

+0

一個鏈接將使這個答案真棒。 – 2013-02-18 11:20:24

+0

感謝您的快速反應和解釋!使它更清晰,正是我所期待的! – user2082955 2013-02-18 11:30:00

+0

謝謝@silkfire它的魅力!但我需要這個正則表達式來接受小寫字母。現在它只接受大寫郵編。 – vignesh 2015-03-10 12:20:17

0

如果你只看着我認爲這就是「比賽只有那些郵政編碼」手段,你可以用它來搭配DN15-DN41:

if(preg_match("/^DN(1[5-9]|[23][0-9]|4[01])/", $postcode)) 
{ 
    //Do something 
} 
+0

這看起來有些尷尬。我不認爲正則表達式是數字範圍的好選擇。也許在DN之後提取數字並執行邏輯* $ nums> = 15 && $ nums <= 41 *。 – kjetilh 2013-02-18 11:38:37

+2

我還沒有遇到任何看起來不尷尬的正則表達式。 – blackarm 2013-02-18 11:41:23