特定英国邮政编码区域代码需要preg_match正则表达式

时间:2013-02-18 11:16:10

标签: php regex preg-match

我的正则表达式知识不是最好的,虽然我一直在浏览帖子以了解它我无法找到我正在寻找的东西。

我想使用以下内容(其中$ postcode是用户输入的完整邮政编码):

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的第一部分。

我希望有足够的信息,并提前感谢您的帮助。

2 个答案:

答案 0 :(得分:9)

试试英国政府自己提供的这种正则表达式:

(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页)

答案 1 :(得分:0)

如果您只想匹配DN15-DN41,因为我认为“只匹配那些邮政编码”意味着,您可以使用:

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