php получить первую часть почтового индекса

Мне нужно извлечь первую часть почтового индекса для расчета поиска с использованием базы данных. Любые идеи?! Мне это нужно для реализации модуля поиска на сайте, который ищет релевантную информацию по почтовому индексу. Но в базе данных, которая у меня есть для почтового индекса, нет второй части почтового индекса, есть только первая часть. Это почтовый индекс Великобритании. Итак, есть идеи?!


person Maverick    schedule 11.06.2011    source источник
comment
Что вы имеете в виду под соответствующей информацией? Чем это отличается от вашего последнего вопроса поиск почтового индекса php codeigniter!? А что именно вы застряли?   -  person Pekka    schedule 12.06.2011
comment
на самом деле, я использую базу данных для расчета ближайшего почтового индекса и отображения некоторой информации, например, о магазинах, в указанном пользователем радиусе, но проблема с моей базой данных заключается в том, что пользователь может ввести BS8 1RY, но в базе данных его только BS8, и это не всегда один и тот же шаблон, первая часть может состоять из 3-4 букв или даже из 2 букв. Я хочу извлечь эту часть, чтобы использовать ее в своих расчетах.   -  person Maverick    schedule 12.06.2011
comment
Хорошо, но о чем точно ваш вопрос?   -  person Pekka    schedule 12.06.2011
comment
Я хочу извлечь эту первую часть почтового индекса из пользовательского ввода, но проблема в том, что я не уверен, образуют ли первые 3 буквы почтовый индекс, который я могу найти в базе данных, или, может быть, первые 2 или первые 4 буквы. Опять же, позвольте мне объяснить, почему я этого хочу, в моей базе данных есть первая часть почтовых индексов, которые не имеют какого-либо определенного шаблона. Первая часть в базе данных имеет 2,3 или даже 4 буквенно-цифровых цифры, но пользователь будет вводить полный почтовый индекс, который я не могу использовать непосредственно в расчете. Итак, для расчета мне нужно извлечь первую часть почтового индекса.   -  person Maverick    schedule 12.06.2011
comment
Это зависит от того, фрагмент почтового индекса Великобритании (например, W1X) занимает большую площадь. Чем меньше фрагмент (например, W1), тем большую площадь он покрывает. Я так и не понял, в чем твой вопрос?   -  person Pekka    schedule 12.06.2011


Ответы (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
comment
Я не проверял, но уверен, что это сработает. Большое спасибо. :) - person Maverick; 12.06.2011