Spazio nel codice postale

Ho uno script che richiede l'input del codice postale per avere uno spazio al suo interno, altrimenti fallirà. Semplice, ma i codici postali del Regno Unito possono avere spazi vuoti in diversi luoghi, ad esempio W1 4SB, NW2 6PT o SG14 1LB, come posso modificare l'input degli utenti, se non è stato inserito alcun gap nel formato corretto utilizzando PHP?

I codici postali finiscono sempre con lettere-lettere . Basta cercare uno spazio al 4 ° carattere prima della fine della string e, se non è presente, inserirlo.

Lo spazio è in realtà sempre nella stessa posizione per i codici postali britannici pienamente qualificati. È appena prima delle ultime 3 cifre / lettere

Quindi prima validation che si tratta di un vero codice postale del Regno Unito e che corrisponde al formato, quindi fai questo:

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

PS. È ansible get la validation del codice postale del Regno Unito regex + ulteriori informazioni da qui

La soluzione che ha funzionato è:

 $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; } 

Se è sempre nello stesso posto (basato sui tuoi esempi), puoi farlo:

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

Probabilmente vorrà fare ancora un po 'di controllo, come se fosse una lunghezza minima, ecc. Ma questo dovrebbe farti andare avanti.

 $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"; 

Due funzioni utili per preparare e validationre i codici postali:

 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("/^[AZ]{1,2}[0-9]{2,3}[AZ]{2}$/", $postcode) || preg_match("/^[AZ]{1,2}[0-9]{1}[AZ]{1}[0-9]{1}[AZ]{2}$/", $postcode) || preg_match("/^GIR0[AZ]{2}$/", $postcode); } 

Esempio di utilizzo:

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

la function di seguito sarà prima codice postale valido, se non valido, restituisce false. se valido, restituirà un codice postale con spazio tra l'outcode e l'incode, indipendentemente dal fatto che gli sia stato assegnato un codice postale con spazio o less.

 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] = '^([az]{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; }