Пробел в почтовом индексе - PullRequest
2 голосов
/ 18 июня 2009

У меня есть скрипт, который требует ввода почтового индекса с пробелом, в противном случае это не удастся. Прямо вперед, но британские почтовые индексы могут иметь пропуски в разных местах, т.е. W1 4SB, NW2 6PT или SG14 1LB, как бы я изменил ввод пользователя, если в правильном формате с помощью PHP нет пропуска?

Ответы [ 7 ]

6 голосов
/ 18 июня 2009

Почтовые индексы всегда заканчиваются цифрой-буквой-буквой . Просто найдите пробел в 4-м символе перед концом строки и, если его там нет, вставьте его.

4 голосов
/ 18 июня 2009

Пробел фактически всегда находится на одной и той же позиции для полностью квалифицированных почтовых индексов Великобритании. Это как раз перед последними 3 цифрами / буквами

Итак, сначала проверьте, что это настоящий почтовый индекс Великобритании, и он соответствует формату, а затем сделайте следующее:

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

PS. Вы можете получить регулярные выражения для проверки почтового индекса в Великобритании + дополнительную информацию от здесь

3 голосов
/ 14 мая 2016

Две функции, которые полезны для подготовки и проверки почтовых индексов:

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

Пример использования:

$postcode = prep_postcode($postcode);
if(is_postcode($postcode)){
  // do something
}
3 голосов
/ 19 июня 2009

Решение, которое сработало:

$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;
  }
3 голосов
/ 18 июня 2009

Если оно всегда в одном и том же месте (на основе ваших примеров), вы можете сделать это:

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

Возможно, вы захотите еще кое-что проверить, например, минимальная длина и т. Д. Но это должно помочь вам.

2 голосов
/ 09 марта 2012
$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 голосов
/ 30 октября 2013
Функция

, приведенная ниже, сначала будет корректно использовать почтовый индекс, если он недействителен, возвращает false. если он действителен, он вернет почтовый индекс с пробелом между outcode и incode, независимо от того, указали вы почтовый индекс с пробелом или нет.

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...