8
votes

Expression régulière allemande zip-codes

J'abandonne. J'ai besoin d'une expression régulière (PHP) qui ne correspond à 5 numéros de 5 chiffres commençant que sur à partir de 01001 jusqu'à 99998 .

Ainsi, invalide est par exemple 1234, mais pas 01234. Aussi 01000 est invalide, 01002 est invalide, 01002 est invalide, 01002 est invalide. pas, et ainsi de suite. Tout autre nombre à 5 chiffres sauf 99999 est valide.

Ce que j'ai est l'expression régulière suivante, qui fait ce que j'aurais besoin - sauf qu'il correspond toujours à 99999.

Peut-on aider ? Merci ... xxx

update

Je suis désolé, tout le monde, mais les choses sont plus complexes. Je n'ai pas expliqué correctement. Le code postal allemand peut également être 04103 par exemple (voir une liste de certains exemples d'autres ici )


5 commentaires

Y a-t-il une raison pour être une regex?


Je me demande si, pour des raisons de maintenabilité et de complexité, vous n'êtes pas préférable de vérifier si la chaîne consiste à sortir de tous les chiffres, puis à effectuer une comparaison numérique.


Il suffit de faire sacrément sûr qu'il n'y aura jamais de personne de l'extérieur de l'Allemagne remplissant la forme. Parce que des choses comme ceci, c'est ce qui vous rendra complètement fou lorsque vous avez une adresse à l'étranger, pour une raison quelconque.


J'ai besoin d'une regexp car il s'agit d'un chèque automatisé qui utilise REGEXP pour vérifier les champs de saisie pour tous les champs de saisie que j'ai ... et oui, ceci est réservé aux adresses allemandes ;-)


Tag allemand enlevé dans le cadre du Nettoyage 2012 .


6 Réponses :


6
votes

Le moyen le plus rapide est juste pour vérifier si la chaîne est composée de 5 chiffres, puis vérifiez s'il est dans la plage spécifiée:

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


0 commentaires

0
votes

Si vous pouvez éviter d'utiliser Pure Regex, cela validerait le code postal:

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

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


4 commentaires

Avec cet exemple, vous pouvez également correspondre à 111111111 (plus de 5 chiffres).


Je pense que vous devriez ajouter le début et la fin des marqueurs de chaîne (^ et $).


Cela fonctionne sans les marqueurs (car quelque chose de plus de 5 chiffres est> 99999) mais édité de toute façon ...


Oui, mais la conversion vers INT peut ne pas aimer cela si cela correspond à "A11111", je suppose.



17
votes

Vous étiez fermé: xxx

mais si vous pouvez simplement faire une plus grande réégalité, puis utiliser une comparaison numérique séparée, ce serait probablement plus facile à lire.

Alternativement, une version plus simple: xxx

(la version plus simple est juste "Prendre les numéros 01000 - 99999 et Retirez les deux extrémités via un lookahead.)


9 commentaires

Très bien en ce qui concerne 99999 - mais malheureusement, il ne correspond pas 20259, mon ancien code postal ... :-(


@Hein - semble correspondre bien? IDEONE.COM/2N0OP (Notez qu'il y avait un type de typo'd ] juste avant le $ avant; je l'ai édité.)


Le travail est parfaitement - sauf que je viens de trouver que je suis un idiot et je n'ai pas expliqué correctement les zips allemandes - il doit également correspondre à 04109, aussi ...;'- (


^ 01 \ d {2} [1-9] | 0 [2-9] \ d {3} | [1-9] \ d {3} [0-8] | [1-9] \ d {3} (?


@Legolas Votre version ne correspondrait pas au 01100 . La version que j'ai éditée dans cependant.


Cela a l'air assez cool ...! Je vais essayer de le vérifier contre toutes les fermetures zips allemandes que je peux générer et vous permettra de savoir ici ... merci!


La version plus simple en action: Regexpal.com/...


Cool - c'est ça! Merci à tous et surtout à Amber!


Bien sûr .. Et le prochain développeur si je reviendrai sur ce code, il suffira de dire: OH Crap



1
votes
\b(?!01000)(?!99999)(0[1-9]\d{3}|[1-9]\d{4})\b
Edit: corrected, thanks to Hein.

0 commentaires

0
votes

J'ai trouvé une solution à de nombreux pays.

<?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

}
?>


1 commentaires

Oui et vous devriez donner une source lorsque vous postez le code de quelqu'un d'autre. Dans ce cas, la source d'origine était et est toujours: pixelenVision.com/1708/...



0
votes

Voici la solution ultime stricte pour les codes zip allumés. Illinke d'autres solutions, celui-ci n'acceptera que 5 chiffres ( 66111 = ok , 6611166111 = mauvais , asd66111 = faux ).

regex: \ b (((0. 1-46-9] \ d {3}) | (?: [1-357-9] \ d {4}) | (?: [ 4] [0-24-9] \ d {3}) | (?: [6] [013-9] \ d {3})) \ B


0 commentaires