Мне нужно извлечь первую часть почтового индекса для расчета поиска с использованием базы данных. Любые идеи?! Мне это нужно для реализации модуля поиска на сайте, который ищет релевантную информацию по почтовому индексу. Но в базе данных, которая у меня есть для почтового индекса, нет второй части почтового индекса, есть только первая часть. Это почтовый индекс Великобритании. Итак, есть идеи?!
php получить первую часть почтового индекса
Ответы (1)
Это не будет охватывать 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('/^[A-Z]([A-Z]?\d(\d|[A-Z])?|\d[A-Z]?)\s*?\d[A-Z][A-Z]$/i', $postcode))
return preg_replace('/^([A-Z]([A-Z]?\d(\d|[A-Z])?|\d[A-Z]?))\s*?(\d[A-Z][A-Z])$/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('/^([A-Z]{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
Обратите внимание: вы несете ответственность за предоставление действительного почтового индекса.
РЕДАКТИРОВАТЬ: ой, это не распространяется на GIR 0AA, извините
person
LazyOne
schedule
11.06.2011
Я не проверял, но уверен, что это сработает. Большое спасибо. :)
- person Maverick; 12.06.2011
W1X
) занимает большую площадь. Чем меньше фрагмент (например,W1
), тем большую площадь он покрывает. Я так и не понял, в чем твой вопрос? - person Pekka   schedule 12.06.2011