正则表达式德语邮政编码

时间:2011-10-28 08:11:53

标签: php regex zip

我放弃了。我需要一个(PHP)正则表达式,它只匹配从<01>开始到99998 的的5位数字。

因此,无效例如1234,但不是01234.此外01000无效,01002无效,依此类推。除99999之外的任何其他5位数字都有效。

我所拥有的是以下正则表达式,它符合我的要求 - 除了它仍然匹配99999。

任何人都可以帮忙吗?感谢...

^01\d\d[1-9]|[1-9]\d{3}[(?<=9999)[0-8]|[0-9]]$

更新

对不起,每个人,但事情更复杂。我没有正确解释。 德国邮政编码也可以是04103(参见一些更多示例here的列表)

6 个答案:

答案 0 :(得分:13)

你很亲密:

^0[1-9]\d\d(?<!0100)0|0[1-9]\d\d[1-9]|[1-9]\d{3}[0-8]|[1-9]\d{3}(?<!9999)9$

但是,如果你可以做一个更简单的正则表达式,然后使用单独的数字比较,那可能更容易阅读。

或者,更简单的版本:

^(?!01000|99999)(0[1-9]\d{3}|[1-9]\d{4})$

(更简单的版本只是“取数字01000 - 99999并通过前瞻删除两端。”

答案 1 :(得分:5)

最快的方法是检查字符串是否由5位数组成,然后检查它是否在指定范围内:

if ( preg_match('/^\d{5}$/', $input) && (int) $input > 1000 && (int) $input < 99999 ) {}

答案 2 :(得分:1)

\b(?!01000)(?!99999)(0[1-9]\d{3}|[1-9]\d{4})\b

编辑:更正了,感谢Hein。

答案 3 :(得分:0)

如果您可以避免使用纯正则表达式,则会验证邮政编码:

function validate( $num ) {
    if( !preg_match( '/^\d{5}$/', $num ) ) {
        return false;
    }

    return ( $num > 1000 && $num < 99999 ); 
}

答案 4 :(得分:0)

我找到了许多国家的解决方案。

<?php
$country_code="US";
$zip_postal="11111";

$ZIPREG=array(
    "US"=>"^\d{5}([\-]?\d{4})?$",
    "UK"=>"^(GIR|[A-Z]\d[A-Z\d]??|[A-Z]{2}\d[A-Z\d]??)[ ]??(\d[A-Z]{2})$",
    "DE"=>"\b((?:0[1-46-9]\d{3})|(?:[1-357-9]\d{4})|(?:[4][0-24-9]\d{3})|(?:[6][013-9]\d{3}))\b",
    "CA"=>"^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ])\ {0,1}(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$",
    "FR"=>"^(F-)?((2[A|B])|[0-9]{2})[0-9]{3}$",
    "IT"=>"^(V-|I-)?[0-9]{5}$",
    "AU"=>"^(0[289][0-9]{2})|([1345689][0-9]{3})|(2[0-8][0-9]{2})|(290[0-9])|(291[0-4])|(7[0-4][0-9]{2})|(7[8-9][0-9]{2})$",
    "NL"=>"^[1-9][0-9]{3}\s?([a-zA-Z]{2})?$",
    "ES"=>"^([1-9]{2}|[0-9][1-9]|[1-9][0-9])[0-9]{3}$",
    "DK"=>"^([D-d][K-k])?( |-)?[1-9]{1}[0-9]{3}$",
    "SE"=>"^(s-|S-){0,1}[0-9]{3}\s?[0-9]{2}$",
    "BE"=>"^[1-9]{1}[0-9]{3}$"
);

if ($ZIPREG[$country_code]) {

    if (!preg_match("/".$ZIPREG[$country_code]."/i",$zip_postal)){
        //Validation failed, provided zip/postal code is not valid.
    } else {
        //Validation passed, provided zip/postal code is valid.
    }

} else {

    //Validation not available

}
?>

答案 5 :(得分:0)

这是针对德国邮政编码的最终严格解决方案。取消链接其他解决方案,此解决方案将仅接受5位数字( 66111 = 确定 6611166111 = 错误 asd66111 = 错误)。

正则表达式:\b((?:0[1-46-9]\d{3})|(?:[1-357-9]\d{4})|(?:[4][0-24-9]\d{3})|(?:[6][013-9]\d{3}))\b