Search code examples
phpcodeigniterpostal-code

php get the first part of postcode


I need to extract the first part of postcode for search calculation using a database. Any ideas?! I need this to implement a search module in the site, which looks out for some relevant information according to the post code. But the database which I am having for post code, it doesnt have second part of the postcode, only the first part is there. Its for UK postcode. So, any ideas?!


Solution

  • This will not cover 100% of all possible UK postcodes, but will do for like 99.999% or so :)

    /**
     * @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;
    }
    

    Test data:

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

    Results:

    TW135BQ -> TW13
    gir0aa -> GIR0AA
    RG5 3SQ -> RG5
    AB51 0GQ -> AB51
    YO104EA -> YO10
    SE154NS -> SE15
    W1B4BD -> W1B
    

    Please note: It is your responsibility to provide valid postcode.

    EDIT: oops, it does not cover GIR 0AA, sorry