Мне нужно извлечь первую часть почтового индекса для поиска, используя базу данных. Есть идеи?! Мне нужно это для реализации поискового модуля на сайте, который ищет некоторую релевантную информацию в соответствии с почтовым кодом. Но база данных, которую у меня есть для почтового кода, у нее нет второй части почтового индекса, там только первая часть. Его для британского почтового индекса. Итак, какие-нибудь идеи ?!
Это не будет покрывать 100% всех возможных почтовых индексов Великобритании, но будет делать как 99,999% или около того 🙂
/** * @param string $postcode UK Postcode * @return string */ function getUKPostcodeFirstPart($postcode) { // validate input parameters $postcode = strtoupper($postcode); // UK mainland / Channel Islands (simplified version, since we do not require to validate it) if (preg_match('/^[AZ]([AZ]?\d(\d|[AZ])?|\d[AZ]?)\s*?\d[AZ][AZ]$/i', $postcode)) return preg_replace('/^([AZ]([AZ]?\d(\d|[AZ])?|\d[AZ]?))\s*?(\d[AZ][AZ])$/i', '$1', $postcode); // British Forces if (preg_match('/^(BFPO)\s*?(\d{1,4})$/i', $postcode)) return preg_replace('/^(BFPO)\s*?(\d{1,4})$/i', '$1', $postcode); // overseas territories if (preg_match('/^(ASCN|BBND|BIQQ|FIQQ|PCRN|SIQQ|STHL|TDCU|TKCA)\s*?(1ZZ)$/i', $postcode)) return preg_replace('/^([AZ]{4})\s*?(1ZZ)$/i', '$1', $postcode); // well ... even other form of postcode... return it as is return $postcode; }
Данные испытаний:
echo 'TW135BQ -> ', getUKPostcodeFirstPart('TW135BQ'), "\n"; echo 'gir0aa -> ', getUKPostcodeFirstPart('gir0aa'), "\n"; echo 'RG5 3SQ -> ', getUKPostcodeFirstPart('RG5 3SQ'), "\n"; echo 'AB51 0GQ -> ', getUKPostcodeFirstPart('AB51 0GQ'), "\n"; echo 'YO104EA -> ', getUKPostcodeFirstPart('YO104EA'), "\n"; echo 'SE154NS -> ', getUKPostcodeFirstPart('SE154NS'), "\n"; echo 'W1B4BD -> ', getUKPostcodeFirstPart('W1B4BD'), "\n";
Результаты:
TW135BQ -> TW13 gir0aa -> GIR0AA RG5 3SQ -> RG5 AB51 0GQ -> AB51 YO104EA -> YO10 SE154NS -> SE15 W1B4BD -> W1B
Обратите внимание: вы несете ответственность за предоставление действительного почтового индекса.
EDIT: oops, он не распространяется на GIR 0AA, извините