2009-06-18 7 views
1

J'ai un script qui nécessite l'entrée du code postal pour y avoir un espace, sinon il échouera. Straight forward, mais les codes postaux UK peuvent avoir des lacunes dans différents endroits, à savoir W1 4SB, NW2 6PT ou SG14 1LB comment je changerais l'entrée des utilisateurs, s'il n'y a pas d'écart entré au format correct en utilisant PHP?Espace dans le code postal

+5

L'écart est toujours au même endroit - immédiatement avant le dernier chiffre et deux lettres –

+0

Les gens peuvent vouloir vérifier les règles officielles. Les gens supposent ici que le 3ème élément (où 3ème est 3 dans AB12 3CD) est seulement 1 chiffre. Source: http://www.royalmail.com/delivery/mail-advice/postcodes-addresses-explained – Paul

+0

Sont-ils * supposés * avoir un espace? Royal Mail dit qu'il devrait, mais y at-il une source officielle? Maintenant que le courrier au Royaume-Uni a été démonopolisé. –

Répondre

3
CP UK

La solution qui a fonctionné est:

$postcode = trim(strip_tags($_REQUEST['postcode'])); 
$test = $postcode; 
if(substr($test, -3) == " ") { 
    $postcode = $postcode; 
    } 
    else { 
    function stringrpl($x,$r,$str) 
    { 
    $out = ""; 
    $temp = substr($str,$x); 
    $out = substr_replace($str,"$r",$x); 
    $out .= $temp; 
    return $out; 
    } 

    $test = stringrpl(-3," ",$test); 
$postcode = $test; 
    } 
+0

je voudrais également supprimer les espaces doubles si quelqu'un entre le code postal avec un espace - preg_replace ('/ \\ s +/',' ', $ code postal) –

+0

Je voudrais également vérifier si la première lettre est O ou 0 et i ou 1 – rosh3000

3

S'il est toujours au même endroit (en fonction de vos exemples), vous pouvez le faire:

<?php 
//...assuming postalcode has already been loaded into $postalcode... 

//If the fourth-to-last char isn't a space, add one in that position 
if (substr($postalcode, -4, 1) != " ") { 
    $postalcode = substr($postalcode, 0, strlen($postalcode) - 3). 
        " ".substr($postalcode, -3); 
} 

//do whatever with $postalcode you'd normally do... 
?> 

veulent probablement faire un peu plus de vérifier autour de cela, comme il est d'une longueur min, etc. Mais ça devrait te faire partir.

6

Postcodes always end with digit-letter-letter. Cherchez simplement un espace au 4ème caractère avant la fin de la chaîne et si ce n'est pas le cas, insérez-le.

+0

pas vrai, il y a A9 9AA, A9A 9AA et AA9A 9AA. Vous cherchez le 4ème personnage n'aide pas. –

+3

@Claudiu Vous avez mal lu mon message. 4ème ** DE LA FIN **. Tous les codes postaux se terminent par le format 9AA, quel que soit leur nombre au début. –

4

L'espace est toujours au même endroit pour les codes postaux britanniques complets. Il est juste avant les 3 derniers chiffres/lettres

Alors d'abord valider qu'il est un vrai code postal Royaume-Uni et il correspond au format, faites ceci:

$postcode = 'E154EZ'; 
if(isValidPostcode($postcode)){ 
    $postcode = str_replace(' ','',$postcode); 
    $postcode = wordwrap($postcode, strlen($postcode)-3,' ', true); 
} 

PS. Vous pouvez obtenir la validation regexes + info de here

+0

isValidPostcode - est-ce PEAR? –

+0

C'est juste une fonction fictive que j'ai placée pour indiquer où vous devriez valider le code postal. vous pouvez réellement implémenter la fonction juste en utilisant la regex dans le lien que j'ai posté. – duckyflip

+0

Ce n'est pas tout à fait exact. W7 2JD est un code postal valide, le code ci-dessus en fait "W7 2J D". '' 'php> $ stripped = str_replace ('', '', 'W7 2JD'); Php> echo wordwrap (str_replace ('', '', $ stripped), strlen ($ stripped) -3, '', true); '' '. – Diziet

2
$pcode_title = trim(strip_tags($_GET['pcode_title'])); 
$pcode_title = eregi_replace(" ", "", $pcode_title); 
$pcode_first = substr($pcode_title, 0, -3); 
$pcode_last = substr($pcode_title, -3); 
$postcode = "$pcode_first"." "."$pcode_last"; 
0
fonction

ci-dessous valide code postal d'abord, sinon valide, retourne false. si elle est valide, elle renverra un code postal avec un espace entre outcode et incode, peu importe si vous lui donnez un code postal avec ou sans espace.

function checkPostcode (&$toCheck) { 
    // Permitted letters depend upon their position in the postcode. 
    $alpha1 = "[abcdefghijklmnoprstuwyz]";       // Character 1 
    $alpha2 = "[abcdefghklmnopqrstuvwxy]";       // Character 2 
    $alpha3 = "[abcdefghjkpmnrstuvwxy]";       // Character 3 
    $alpha4 = "[abehmnprvwxy]";          // Character 4 
    $alpha5 = "[abdefghjlnpqrstuwxyz]";        // Character 5 

    // Expression for postcodes: AN NAA, ANN NAA, AAN NAA, and AANN NAA with a space 
    $pcexp[0] = '^('.$alpha1.'{1}'.$alpha2.'{0,1}[0-9]{1,2})([[:space:]]{0,})([0-9]{1}'.$alpha5.'{2})$'; 

    // Expression for postcodes: ANA NAA 
    $pcexp[1] = '^('.$alpha1.'{1}[0-9]{1}'.$alpha3.'{1})([[:space:]]{0,})([0-9]{1}'.$alpha5.'{2})$'; 

    // Expression for postcodes: AANA NAA 
    $pcexp[2] = '^('.$alpha1.'{1}'.$alpha2.'{1}[0-9]{1}'.$alpha4.')([[:space:]]{0,})([0-9]{1}'.$alpha5.'{2})$'; 

    // Exception for the special postcode GIR 0AA 
    $pcexp[3] = '^(gir)(0aa)$'; 

    // Standard BFPO numbers 
    $pcexp[4] = '^(bfpo)([0-9]{1,4})$'; 

    // c/o BFPO numbers 
    $pcexp[5] = '^(bfpo)(c\/o[0-9]{1,3})$'; 

    // Overseas Territories 
    $pcexp[6] = '^([a-z]{4})(1zz)$/i'; 

    // Load up the string to check, converting into lowercase 
    $postcode = strtolower($toCheck); 

    // Assume we are not going to find a valid postcode 
    $valid = false; 

    // Check the string against the six types of postcodes 
    foreach ($pcexp as $regexp) { 

    if (ereg($regexp,$postcode, $matches)) { 

     // Load new postcode back into the form element 
      $postcode = strtoupper ($matches[1] . ' ' . $matches [3]); 

     // Take account of the special BFPO c/o format 
     $postcode = ereg_replace ('C\/O', 'c/o ', $postcode); 

     // Remember that we have found that the code is valid and break from loop 
     $valid = true; 
     break; 
    } 
    } 

    // Return with the reformatted valid postcode in uppercase if the postcode was 
    // valid 
    if ($valid){ 
     $toCheck = $postcode; 
     return true; 
    } 
    else return false; 
} 
+0

ereg et ereg_replace ont été tous deux décriés par PHP 5.3. – chrismacp

2

Deux fonctions qui sont utiles pour la préparation et la validation des codes postaux:

function prep_postcode($str){ 
    $str = strtoupper($str); 
    $str = trim($str); 
    if(substr($str, -4, 1) != ' ') 
     $str = substr($str, 0, strlen($str) - 3) . " " . substr($str, -3); 
    return $str; 
} 

function is_postcode($postcode){ 
    $postcode = str_replace(' ','',$postcode); 
    return 
     preg_match("/^[A-Z]{1,2}[0-9]{2,3}[A-Z]{2}$/", $postcode) 
     || preg_match("/^[A-Z]{1,2}[0-9]{1}[A-Z]{1}[0-9]{1}[A-Z]{2}$/", $postcode) 
     || preg_match("/^GIR0[A-Z]{2}$/", $postcode); 
} 

Exemple d'utilisation:

$postcode = prep_postcode($postcode); 
if(is_postcode($postcode)){ 
    // do something 
} 
Questions connexes