2015-04-19 35 views
0

我想從數組中挑選郵編。我使用郵局的正則表達式來查找匹配。英國郵政編碼正則表達式產生假possitives

$postcodeRegex = "/(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})/"; 

foreach($content as $key => $line){ 
    if(preg_match($postcodeRegex, $line, $matches) !== false) { 
     $points[] = $key; 
    } 
} 

但preg_match一直在產生誤報。例如,下面的行顯示爲匹配。

HYPERLINK 「的mailto:[email protected][email protected]

我正則表達式的技能都很差。我如何減少這些誤報?

感謝

編輯,數組中元素的樣本:

[2] => Firstname lastname 
[6] => 99 Example Street, Example Town, Example City, EX4 3PL 
[8] => HYPERLINK "mailto:[email protected]" [email protected] 
[10] => 07712 345678 
[16] => KEY SKILLS 
[18] => Technical Skills 
[20] => Microsoft Outlook 
[22] => Microsoft Word 
[24] => Microsoft Excel 
+0

POS [英國郵政編碼正則表達式(綜合)](http://stackoverflow.com/questions/164979/uk-postcode-regex-comprehensive) – jurgemaister

+0

您可以發佈包含正確和不正確值的數組的一部分嗎? –

+0

@PedroLobito完成:) – user3343171

回答

0

看來你正在使用正則表達式supplied by the UK Government

但第一次檢查,如果你正在處理一個有效的英國郵編:

$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 
} 


更新根據您的意見:

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})/', $address)) { 

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})/im', $address , $postcode); 

echo $postcode[0]; 

} 

輸出:

EX4 3PL 

DEMO

+0

好吧我是個白癡。我想獲得帖子代碼從字符串 – user3343171

+0

大聲笑....好吧,我會更新我的代碼... –

+0

@ user3343171檢查更新的答案 –