Php 正则表达式德语邮政编码

Php 正则表达式德语邮政编码,php,regex,zip,Php,Regex,Zip,我放弃了。我需要一个(PHP)正则表达式,它只匹配从01001到99998的5位数字 例如,invalid是1234,但不是01234。此外,01000无效,01002无效,依此类推。除99999以外的任何其他5位数字均有效 我拥有的是下面的正则表达式,它满足我的要求-除了它仍然匹配99999 有人能帮忙吗?谢谢 ^01\d\d[1-9]|[1-9]\d{3}[(?<=9999)[0-8]|[0-9]]$ ^01\d\d[1-9]|[1-9]\d{3}[(?最快的方法就是检查字符串是否由

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

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

我拥有的是下面的正则表达式,它满足我的要求-除了它仍然匹配99999

有人能帮忙吗?谢谢

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

^01\d\d[1-9]|[1-9]\d{3}[(?最快的方法就是检查字符串是否由5位数字组成,然后检查它是否在指定的范围内:

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

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

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

    return ( $num > 1000 && $num < 99999 ); 
}
函数验证($num){
如果(!preg_match('/^\d{5}$/',$num)){
返回false;
}
返回($num>1000&$num<99999);
}
你很接近:

^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
,通过向前看移除两端。)


编辑:更正,多亏了海因。

我找到了适用于许多国家的解决方案

<?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位数字(66111=正常,6611166111=错误,asd66111=错误


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

是否有理由必须使用正则表达式?我想知道,出于可维护性和复杂性的考虑,您是否最好先检查字符串是否由所有数字组成,然后进行数字比较。只需确保永远不会有来自德国以外的人填写表单。因为像这样的东西无论出于什么原因,当你碰巧在国外有一个地址时,s会让你发疯。我需要一个regexp,因为它是一个自动检查,使用regexp检查我所有输入字段的输入字段…是的,这只适用于德语地址;-)标记
german
已作为的一部分删除。在此示例中,您还可以匹配
111111111
(超过5位)。我认为您应该添加字符串开头和结尾标记(^和$)。它在没有标记的情况下工作(因为任何超过5位的标记都大于99999)但是不管怎样编辑了…是的,但是如果它与“a11111”匹配,我猜转换为int可能不喜欢它。关于9999非常好-但不幸的是它与20259不匹配,我以前的邮政编码…:-(@Hein-似乎匹配得很好?(注意,
$
之前有一个拼写错误d
]
,我编辑了它。)工作做得很完美——除了我发现我是个白痴,没有正确解释德语拉链——它也需要匹配04109…;'-(
^01\d{2}[1-9]| 0[2-9]\d{3}[1-9]\d{3}[0-8]|[1-9]\d{3}](?@Legolas您的版本与
01100
不匹配。但是,我编辑的版本与之匹配。是的,当您发布其他人的代码时,您应该提供一个源代码。在这种情况下,原始源代码过去是,现在仍然是:
\b(?!01000)(?!99999)(0[1-9]\d{3}|[1-9]\d{4})\b
<?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

}
?>