* @copyright The Analysis and Solutions Company, 2001-2010 * @license http://www.analysisandsolutions.com/software/license.htm Simple Public License * @link http://www.analysisandsolutions.com/software/addr/addr.htm */ /** * Formats a Delivery Address Line according to the United States Postal * Service's Addressing Standards * * The class also contains a state list generator for use in XHTML forms. * * @package AddressStandardizationSolution * @author Daniel Convissor * @copyright The Analysis and Solutions Company, 2001-2010 * @license http://www.analysisandsolutions.com/software/license.htm Simple Public License * @link http://www.analysisandsolutions.com/software/addr/addr.htm */ class AddressStandardizationSolution { /** * An array with compass directions as keys and abbreviations as values * * Note: entries ending in "-R" are for reverse lookup. * * @var array */ public $directionals = array( 'E' => 'E', 'EAST' => 'E', 'E-R' => 'EAST', 'N' => 'N', 'NO' => 'N', 'NORTH' => 'N', 'N-R' => 'NORTH', 'NE' => 'NE', 'NORTHEAST' => 'NE', 'NE-R' => 'NORTHEAST', 'NORTHWEST' => 'NW', 'NW-R' => 'NORTHWEST', 'NW' => 'NW', 'S' => 'S', 'SO' => 'S', 'SOUTH' => 'S', 'S-R' => 'SOUTH', 'SE' => 'SE', 'SOUTHEAST' => 'SE', 'SE-R' => 'SOUTHEAST', 'SOUTHWEST' => 'SW', 'SW-R' => 'SOUTHWEST', 'SW' => 'SW', 'W' => 'W', 'WEST' => 'W', 'W-R' => 'WEST', ); /** * An array with room types as keys and abbreviations as values * * Note: entries ending in "-R" are for reverse lookup. * * @var array */ public $identifiers = array( 'APARTMENT' => 'APT', 'APT-R' => 'APARTMENT', 'APT' => 'APT', 'BLDG' => 'BLDG', 'BUILDING' => 'BLDG', 'BLDG-R' => 'BUILDING', 'BOX' => 'BOX', 'BOX-R' => 'BOX', 'BASEMENT' => 'BSMT', 'BSMT-R' => 'BASEMENT', 'BSMT' => 'BSMT', 'DEPARTMENT' => 'DEPT', 'DEPT-R' => 'DEPARTMENT', 'DEPT' => 'DEPT', 'FL' => 'FL', 'FLOOR' => 'FL', 'FL-R' => 'FLOOR', 'FRNT' => 'FRNT', 'FRONT' => 'FRNT', 'FRNT-R' => 'FRONT', 'HANGER' => 'HNGR', 'HNGR-R' => 'HANGER', 'HNGR' => 'HNGR', 'KEY' => 'KEY', 'KEY-R' => 'KEY', 'LBBY' => 'LBBY', 'LOBBY' => 'LBBY', 'LBBY-R' => 'LOBBY', 'LOT' => 'LOT', 'LOT-R' => 'LOT', 'LOWER' => 'LOWR', 'LOWR-R' => 'LOWER', 'LOWR' => 'LOWR', 'OFC' => 'OFC', 'OFFICE' => 'OFC', 'OFC-R' => 'OFFICE', 'PENTHOUSE' => 'PH', 'PH-R' => 'PENTHOUSE', 'PH' => 'PH', 'PIER' => 'PIER', 'PIER-R' => 'PIER', 'PMB' => 'PMB', 'PMB-R' => 'PMB', 'REAR' => 'REAR', 'REAR-R' => 'REAR', 'RM' => 'RM', 'ROOM' => 'RM', 'RM-R' => 'ROOM', 'SIDE' => 'SIDE', 'SIDE-R' => 'SIDE', 'SLIP' => 'SLIP', 'SLIP-R' => 'SLIP', 'SPACE' => 'SPC', 'SPC-R' => 'SPACE', 'SPC' => 'SPC', 'STE' => 'STE', 'SUITE' => 'STE', 'STE-R' => 'SUITE', 'STOP' => 'STOP', 'STOP-R' => 'STOP', 'TRAILER' => 'TRLR', 'TRLR-R' => 'TRAILER', 'TRLR' => 'TRLR', 'UNIT' => 'UNIT', 'UNIT-R' => 'UNIT', 'UPPER' => 'UPPR', 'UPPR-R' => 'UPPER', 'UPPR' => 'UPPR', 'UPR' => 'UPPR', ); /** * An array with numeric words as keys and numbers as values * @var array */ public $numbers = array( 'FIRST' => '1', 'ONE' => '1', 'TEN' => '10', 'TENTH' => '10', 'ELEVEN' => '11', 'ELEVENTH' => '11', 'TWELFTH' => '12', 'TWELVE' => '12', 'THIRTEEN' => '13', 'THIRTEENTH' => '13', 'FOURTEEN' => '14', 'FOURTEENTH' => '14', 'FIFTEEN' => '15', 'FIFTEENTH' => '15', 'SIXTEEN' => '16', 'SIXTEENTH' => '16', 'SEVENTEEN' => '17', 'SEVENTEENTH' => '17', 'EIGHTEEN' => '18', 'EIGHTEENTH' => '18', 'NINETEEN' => '19', 'NINETEENTH' => '19', 'SECOND' => '2', 'TWO' => '2', 'TWENTIETH' => '20', 'TWENTY' => '20', 'THIRD' => '3', 'THREE' => '3', 'FOUR' => '4', 'FOURTH' => '4', 'FIFTH' => '5', 'FIVE' => '5', 'SIX' => '6', 'SIXTH' => '6', 'SEVEN' => '7', 'SEVENTH' => '7', 'EIGHT' => '8', 'EIGHTH' => '8', 'NINE' => '9', 'NINTH' => '9', ); /** * An array with state names as keys and abbreviations as values * @var array */ public $states = array( 'ARMED FORCES AMERICA' => 'AA', 'ARMED FORCES EUROPE' => 'AE', 'ALASKA' => 'AK', 'ALABAMA' => 'AL', 'ARMED FORCES PACIFIC' => 'AP', 'ARKANSAS' => 'AR', 'ARIZONA' => 'AZ', 'CALIFORNIA' => 'CA', 'COLORADO' => 'CO', 'CONNECTICUT' => 'CT', 'DISTRICT OF COLUMBIA' => 'DC', 'DELAWARE' => 'DE', 'FLORIDA' => 'FL', 'GEORGIA' => 'GA', 'HAWAII' => 'HI', 'IOWA' => 'IA', 'IDAHO' => 'ID', 'ILLINOIS' => 'IL', 'INDIANA' => 'IN', 'KANSAS' => 'KS', 'KENTUCKY' => 'KY', 'LOUISIANA' => 'LA', 'MASSACHUSETTS' => 'MA', 'MARYLAND' => 'MD', 'MAINE' => 'ME', 'MICHIGAN' => 'MI', 'MINNESOTA' => 'MN', 'MISSOURI' => 'MO', 'MISSISSIPPI' => 'MS', 'MONTANA' => 'MT', 'NORTH CAROLINA' => 'NC', 'NORTH DAKOTA' => 'ND', 'NEBRASKA' => 'NE', 'NEW HAMPSHIRE' => 'NH', 'NEW JERSEY' => 'NJ', 'NEW MEXICO' => 'NM', 'NEVADA' => 'NV', 'NEW YORK' => 'NY', 'OHIO' => 'OH', 'OKLAHOMA' => 'OK', 'OREGON' => 'OR', 'PENNSYLVANIA' => 'PA', 'RHODE ISLAND' => 'RI', 'SOUTH CAROLINA' => 'SC', 'SOUTH DAKOTA' => 'SD', 'TENNESSEE' => 'TN', 'TEXAS' => 'TX', 'UTAH' => 'UT', 'VIRGINIA' => 'VA', 'VERMONT' => 'VT', 'WASHINGTON' => 'WA', 'WISCONSIN' => 'WI', 'WEST VIRGINIA' => 'WV', 'WYOMING' => 'WY', ); /** * An array with street types as keys and abbreviations as values * * Note: entries ending in "-R" are for reverse lookup. * * @var array */ public $suffixes = array( 'ALLEE' => 'ALY', 'ALLEY' => 'ALY', 'ALY-R' => 'ALLEY', 'ALLY' => 'ALY', 'ALY' => 'ALY', 'ANEX' => 'ANX', 'ANNEX' => 'ANX', 'ANX-R' => 'ANNEX', 'ANNX' => 'ANX', 'ANX' => 'ANX', 'ARC' => 'ARC', 'ARCADE' => 'ARC', 'ARC-R' => 'ARCADE', 'AV' => 'AVE', 'AVE' => 'AVE', 'AVEN' => 'AVE', 'AVENU' => 'AVE', 'AVENUE' => 'AVE', 'AVE-R' => 'AVENUE', 'AVN' => 'AVE', 'AVNUE' => 'AVE', 'BCH' => 'BCH', 'BEACH' => 'BCH', 'BCH-R' => 'BEACH', 'BG' => 'BG', 'BURG' => 'BG', 'BG-R' => 'BURG', 'BGS' => 'BGS', 'BURGS' => 'BGS', 'BGS-R' => 'BURGS', 'BLF' => 'BLF', 'BLUF' => 'BLF', 'BLUFF' => 'BLF', 'BLF-R' => 'BLUFF', 'BLFS' => 'BLFS', 'BLUFFS' => 'BLFS', 'BLFS-R' => 'BLUFFS', 'BLVD' => 'BLVD', 'BLVRD' => 'BLVD', 'BOUL' => 'BLVD', 'BOULEVARD' => 'BLVD', 'BLVD-R' => 'BOULEVARD', 'BOULOVARD' => 'BLVD', 'BOULV' => 'BLVD', 'BOULVRD' => 'BLVD', 'BULAVARD' => 'BLVD', 'BULEVARD' => 'BLVD', 'BULLEVARD' => 'BLVD', 'BULOVARD' => 'BLVD', 'BULVD' => 'BLVD', 'BEND' => 'BND', 'BND-R' => 'BEND', 'BND' => 'BND', 'BR' => 'BR', 'BRANCH' => 'BR', 'BR-R' => 'BRANCH', 'BRNCH' => 'BR', 'BRDGE' => 'BRG', 'BRG' => 'BRG', 'BRGE' => 'BRG', 'BRIDGE' => 'BRG', 'BRG-R' => 'BRIDGE', 'BRK' => 'BRK', 'BROOK' => 'BRK', 'BRK-R' => 'BROOK', 'BRKS' => 'BRKS', 'BROOKS' => 'BRKS', 'BRKS-R' => 'BROOKS', 'BOT' => 'BTM', 'BOTTM' => 'BTM', 'BOTTOM' => 'BTM', 'BTM-R' => 'BOTTOM', 'BTM' => 'BTM', 'BYP' => 'BYP', 'BYPA' => 'BYP', 'BYPAS' => 'BYP', 'BYPASS' => 'BYP', 'BYP-R' => 'BYPASS', 'BYPS' => 'BYP', 'BAYOO' => 'BYU', 'BAYOU' => 'BYU', 'BYU-R' => 'BAYOU', 'BYO' => 'BYU', 'BYOU' => 'BYU', 'BYU' => 'BYU', 'CIR' => 'CIR', 'CIRC' => 'CIR', 'CIRCEL' => 'CIR', 'CIRCL' => 'CIR', 'CIRCLE' => 'CIR', 'CIR-R' => 'CIRCLE', 'CRCL' => 'CIR', 'CRCLE' => 'CIR', 'CIRCELS' => 'CIRS', 'CIRCLES' => 'CIRS', 'CIRS-R' => 'CIRCLES', 'CIRCLS' => 'CIRS', 'CIRCS' => 'CIRS', 'CIRS' => 'CIRS', 'CRCLES' => 'CIRS', 'CRCLS' => 'CIRS', 'CLB' => 'CLB', 'CLUB' => 'CLB', 'CLB-R' => 'CLUB', 'CLF' => 'CLF', 'CLIF' => 'CLF', 'CLIFF' => 'CLF', 'CLF-R' => 'CLIFF', 'CLFS' => 'CLFS', 'CLIFFS' => 'CLFS', 'CLFS-R' => 'CLIFFS', 'CLIFS' => 'CLFS', 'CMN' => 'CMN', 'COMMON' => 'CMN', 'CMN-R' => 'COMMON', 'COMN' => 'CMN', 'COR' => 'COR', 'CORN' => 'COR', 'CORNER' => 'COR', 'COR-R' => 'CORNER', 'CRNR' => 'COR', 'CORNERS' => 'CORS', 'CORS-R' => 'CORNERS', 'CORNRS' => 'CORS', 'CORS' => 'CORS', 'CRNRS' => 'CORS', 'CAMP' => 'CP', 'CP-R' => 'CAMP', 'CMP' => 'CP', 'CP' => 'CP', 'CAPE' => 'CPE', 'CPE-R' => 'CAPE', 'CPE' => 'CPE', 'CRECENT' => 'CRES', 'CRES' => 'CRES', 'CRESCENT' => 'CRES', 'CRES-R' => 'CRESCENT', 'CRESENT' => 'CRES', 'CRSCNT' => 'CRES', 'CRSENT' => 'CRES', 'CRSNT' => 'CRES', 'CK' => 'CRK', 'CR' => 'CRK', 'CREEK' => 'CRK', 'CRK-R' => 'CREEK', 'CREK' => 'CRK', 'CRK' => 'CRK', 'COARSE' => 'CRSE', 'COURSE' => 'CRSE', 'CRSE-R' => 'COURSE', 'CRSE' => 'CRSE', 'CREST' => 'CRST', 'CRST-R' => 'CREST', 'CRST' => 'CRST', 'CAUSEWAY' => 'CSWY', 'CSWY-R' => 'CAUSEWAY', 'CAUSEWY' => 'CSWY', 'CAUSWAY' => 'CSWY', 'CAUSWY' => 'CSWY', 'CSWY' => 'CSWY', 'CORT' => 'CT', 'COURT' => 'CT', 'CT-R' => 'COURT', 'CRT' => 'CT', 'CT' => 'CT', 'CEN' => 'CTR', 'CENT' => 'CTR', 'CENTER' => 'CTR', 'CTR-R' => 'CENTER', 'CENTR' => 'CTR', 'CENTRE' => 'CTR', 'CNTER' => 'CTR', 'CNTR' => 'CTR', 'CTR' => 'CTR', 'CENS' => 'CTRS', 'CENTERS' => 'CTRS', 'CTRS-R' => 'CENTERS', 'CENTRES' => 'CTRS', 'CENTRS' => 'CTRS', 'CENTS' => 'CTRS', 'CNTERS' => 'CTRS', 'CNTRS' => 'CTRS', 'CTRS' => 'CTRS', 'COURTS' => 'CTS', 'CTS-R' => 'COURTS', 'CTS' => 'CTS', 'CRV' => 'CURV', 'CURV' => 'CURV', 'CURVE' => 'CURV', 'CURV-R' => 'CURVE', 'COV' => 'CV', 'COVE' => 'CV', 'CV-R' => 'COVE', 'CV' => 'CV', 'COVES' => 'CVS', 'CVS-R' => 'COVES', 'COVS' => 'CVS', 'CVS' => 'CVS', 'CAN' => 'CYN', 'CANYN' => 'CYN', 'CANYON' => 'CYN', 'CYN-R' => 'CANYON', 'CNYN' => 'CYN', 'CYN' => 'CYN', 'DAL' => 'DL', 'DALE' => 'DL', 'DL-R' => 'DALE', 'DL' => 'DL', 'DAM' => 'DM', 'DM-R' => 'DAM', 'DM' => 'DM', 'DR' => 'DR', 'DRIV' => 'DR', 'DRIVE' => 'DR', 'DR-R' => 'DRIVE', 'DRV' => 'DR', 'DRIVES' => 'DRS', 'DRS-R' => 'DRIVES', 'DRIVS' => 'DRS', 'DRS' => 'DRS', 'DRVS' => 'DRS', 'DIV' => 'DV', 'DIVD' => 'DV', 'DIVID' => 'DV', 'DIVIDE' => 'DV', 'DV-R' => 'DIVIDE', 'DV' => 'DV', 'DVD' => 'DV', 'EST' => 'EST', 'ESTA' => 'EST', 'ESTATE' => 'EST', 'EST-R' => 'ESTATE', 'ESTAS' => 'ESTS', 'ESTATES' => 'ESTS', 'ESTS-R' => 'ESTATES', 'ESTS' => 'ESTS', 'EXP' => 'EXPY', 'EXPR' => 'EXPY', 'EXPRESS' => 'EXPY', 'EXPRESSWAY' => 'EXPY', 'EXPY-R' => 'EXPRESSWAY', 'EXPRESWAY' => 'EXPY', 'EXPRSWY' => 'EXPY', 'EXPRWY' => 'EXPY', 'EXPW' => 'EXPY', 'EXPWY' => 'EXPY', 'EXPY' => 'EXPY', 'EXWAY' => 'EXPY', 'EXWY' => 'EXPY', 'EXT' => 'EXT', 'EXTEN' => 'EXT', 'EXTENSION' => 'EXT', 'EXT-R' => 'EXTENSION', 'EXTENSN' => 'EXT', 'EXTN' => 'EXT', 'EXTNSN' => 'EXT', 'EXTENS' => 'EXTS', 'EXTENSIONS' => 'EXTS', 'EXTS-R' => 'EXTENSIONS', 'EXTENSNS' => 'EXTS', 'EXTNS' => 'EXTS', 'EXTNSNS' => 'EXTS', 'EXTS' => 'EXTS', 'FAL' => 'FALL', 'FALL' => 'FALL', 'FALL-R' => 'FALL', 'FIELD' => 'FLD', 'FLD-R' => 'FIELD', 'FLD' => 'FLD', 'FIELDS' => 'FLDS', 'FLDS-R' => 'FIELDS', 'FLDS' => 'FLDS', 'FALLS' => 'FLS', 'FLS-R' => 'FALLS', 'FALS' => 'FLS', 'FLS' => 'FLS', 'FLAT' => 'FLT', 'FLT-R' => 'FLAT', 'FLT' => 'FLT', 'FLATS' => 'FLTS', 'FLTS-R' => 'FLATS', 'FLTS' => 'FLTS', 'FORD' => 'FRD', 'FRD-R' => 'FORD', 'FRD' => 'FRD', 'FORDS' => 'FRDS', 'FRDS-R' => 'FORDS', 'FRDS' => 'FRDS', 'FORG' => 'FRG', 'FORGE' => 'FRG', 'FRG-R' => 'FORGE', 'FRG' => 'FRG', 'FORGES' => 'FRGS', 'FRGS-R' => 'FORGES', 'FRGS' => 'FRGS', 'FORK' => 'FRK', 'FRK-R' => 'FORK', 'FRK' => 'FRK', 'FORKS' => 'FRKS', 'FRKS-R' => 'FORKS', 'FRKS' => 'FRKS', 'FOREST' => 'FRST', 'FRST-R' => 'FOREST', 'FORESTS' => 'FRST', 'FORREST' => 'FRST', 'FORRESTS' => 'FRST', 'FORRST' => 'FRST', 'FORRSTS' => 'FRST', 'FORST' => 'FRST', 'FORSTS' => 'FRST', 'FRRESTS' => 'FRST', 'FRRST' => 'FRST', 'FRRSTS' => 'FRST', 'FRST' => 'FRST', 'FERRY' => 'FRY', 'FRY-R' => 'FERRY', 'FERY' => 'FRY', 'FRRY' => 'FRY', 'FRY' => 'FRY', 'FORT' => 'FT', 'FT-R' => 'FORT', 'FRT' => 'FT', 'FT' => 'FT', 'FREEWAY' => 'FWY', 'FWY-R' => 'FREEWAY', 'FREEWY' => 'FWY', 'FREWAY' => 'FWY', 'FREWY' => 'FWY', 'FRWAY' => 'FWY', 'FRWY' => 'FWY', 'FWY' => 'FWY', 'GARDEN' => 'GDN', 'GDN-R' => 'GARDEN', 'GARDN' => 'GDN', 'GDN' => 'GDN', 'GRDEN' => 'GDN', 'GRDN' => 'GDN', 'GARDENS' => 'GDNS', 'GDNS-R' => 'GARDENS', 'GARDNS' => 'GDNS', 'GDNS' => 'GDNS', 'GRDENS' => 'GDNS', 'GRDNS' => 'GDNS', 'GLEN' => 'GLN', 'GLN-R' => 'GLEN', 'GLENN' => 'GLN', 'GLN' => 'GLN', 'GLENNS' => 'GLNS', 'GLENS' => 'GLNS', 'GLNS-R' => 'GLENS', 'GLNS' => 'GLNS', 'GREEN' => 'GRN', 'GRN-R' => 'GREEN', 'GREN' => 'GRN', 'GRN' => 'GRN', 'GREENS' => 'GRNS', 'GRNS-R' => 'GREENS', 'GRENS' => 'GRNS', 'GRNS' => 'GRNS', 'GROV' => 'GRV', 'GROVE' => 'GRV', 'GRV-R' => 'GROVE', 'GRV' => 'GRV', 'GROVES' => 'GRVS', 'GRVS-R' => 'GROVES', 'GROVS' => 'GRVS', 'GRVS' => 'GRVS', 'GATEWAY' => 'GTWY', 'GTWY-R' => 'GATEWAY', 'GATEWY' => 'GTWY', 'GATWAY' => 'GTWY', 'GTWAY' => 'GTWY', 'GTWY' => 'GTWY', 'HARB' => 'HBR', 'HARBOR' => 'HBR', 'HBR-R' => 'HARBOR', 'HARBR' => 'HBR', 'HBR' => 'HBR', 'HRBOR' => 'HBR', 'HARBORS' => 'HBRS', 'HBRS-R' => 'HARBORS', 'HBRS' => 'HBRS', 'HILL' => 'HL', 'HL-R' => 'HILL', 'HL' => 'HL', 'HILLS' => 'HLS', 'HLS-R' => 'HILLS', 'HLS' => 'HLS', 'HLLW' => 'HOLW', 'HLLWS' => 'HOLW', 'HOLLOW' => 'HOLW', 'HOLW-R' => 'HOLLOW', 'HOLLOWS' => 'HOLW', 'HOLOW' => 'HOLW', 'HOLOWS' => 'HOLW', 'HOLW' => 'HOLW', 'HOLWS' => 'HOLW', 'HEIGHT' => 'HTS', 'HEIGHTS' => 'HTS', 'HTS-R' => 'HEIGHTS', 'HGTS' => 'HTS', 'HT' => 'HTS', 'HTS' => 'HTS', 'HAVEN' => 'HVN', 'HVN-R' => 'HAVEN', 'HAVN' => 'HVN', 'HVN' => 'HVN', 'HIGHWAY' => 'HWY', 'HWY-R' => 'HIGHWAY', 'HIGHWY' => 'HWY', 'HIWAY' => 'HWY', 'HIWY' => 'HWY', 'HWAY' => 'HWY', 'HWY' => 'HWY', 'HYGHWAY' => 'HWY', 'HYWAY' => 'HWY', 'HYWY' => 'HWY', 'INLET' => 'INLT', 'INLT-R' => 'INLET', 'INLT' => 'INLT', 'ILAND' => 'IS', 'ILND' => 'IS', 'IS' => 'IS', 'ISLAND' => 'IS', 'IS-R' => 'ISLAND', 'ISLND' => 'IS', 'ILE' => 'ISLE', 'ISLE' => 'ISLE', 'ISLE-R' => 'ISLE', 'ISLES' => 'ISLE', 'ILANDS' => 'ISS', 'ILNDS' => 'ISS', 'ISLANDS' => 'ISS', 'ISS-R' => 'ISLANDS', 'ISLDS' => 'ISS', 'ISLNDS' => 'ISS', 'ISS' => 'ISS', 'JCT' => 'JCT', 'JCTION' => 'JCT', 'JCTN' => 'JCT', 'JUNCTION' => 'JCT', 'JCT-R' => 'JUNCTION', 'JUNCTN' => 'JCT', 'JUNCTON' => 'JCT', 'JCTIONS' => 'JCTS', 'JCTNS' => 'JCTS', 'JCTS' => 'JCTS', 'JUNCTIONS' => 'JCTS', 'JCTS-R' => 'JUNCTIONS', 'JUNCTONS' => 'JCTS', 'JUNGTNS' => 'JCTS', 'KNL' => 'KNL', 'KNOL' => 'KNL', 'KNOLL' => 'KNL', 'KNL-R' => 'KNOLL', 'KNLS' => 'KNLS', 'KNOLLS' => 'KNLS', 'KNLS-R' => 'KNOLLS', 'KNOLS' => 'KNLS', 'KEY' => 'KY', 'KY-R' => 'KEY', 'KY' => 'KY', 'KEYS' => 'KYS', 'KYS-R' => 'KEYS', 'KYS' => 'KYS', 'LAND' => 'LAND', 'LAND-R' => 'LAND', 'LCK' => 'LCK', 'LOCK' => 'LCK', 'LCK-R' => 'LOCK', 'LCKS' => 'LCKS', 'LOCKS' => 'LCKS', 'LCKS-R' => 'LOCKS', 'LDG' => 'LDG', 'LDGE' => 'LDG', 'LODG' => 'LDG', 'LODGE' => 'LDG', 'LDG-R' => 'LODGE', 'LF' => 'LF', 'LOAF' => 'LF', 'LF-R' => 'LOAF', 'LGT' => 'LGT', 'LIGHT' => 'LGT', 'LGT-R' => 'LIGHT', 'LT' => 'LGT', 'LGTS' => 'LGTS', 'LIGHTS' => 'LGTS', 'LGTS-R' => 'LIGHTS', 'LTS' => 'LGTS', 'LAKE' => 'LK', 'LK-R' => 'LAKE', 'LK' => 'LK', 'LAKES' => 'LKS', 'LKS-R' => 'LAKES', 'LKS' => 'LKS', 'LA' => 'LN', 'LANE' => 'LN', 'LN-R' => 'LANE', 'LANES' => 'LN', 'LN' => 'LN', 'LNS' => 'LN', 'LANDG' => 'LNDG', 'LANDING' => 'LNDG', 'LNDG-R' => 'LANDING', 'LANDNG' => 'LNDG', 'LNDG' => 'LNDG', 'LNDNG' => 'LNDG', 'LOOP' => 'LOOP', 'LOOP-R' => 'LOOP', 'LOOPS' => 'LOOP', 'MALL' => 'MALL', 'MALL-R' => 'MALL', 'MDW' => 'MDW', 'MEADOW' => 'MDW', 'MDW-R' => 'MEADOW', 'MDWS' => 'MDWS', 'MEADOWS' => 'MDWS', 'MDWS-R' => 'MEADOWS', 'MEDOWS' => 'MDWS', 'MEDWS' => 'MDWS', 'MEWS' => 'MEWS', 'MEWS-R' => 'MEWS', 'MIL' => 'ML', 'MILL' => 'ML', 'ML-R' => 'MILL', 'ML' => 'ML', 'MILLS' => 'MLS', 'MLS-R' => 'MILLS', 'MILS' => 'MLS', 'MLS' => 'MLS', 'MANOR' => 'MNR', 'MNR-R' => 'MANOR', 'MANR' => 'MNR', 'MNR' => 'MNR', 'MANORS' => 'MNRS', 'MNRS-R' => 'MANORS', 'MANRS' => 'MNRS', 'MNRS' => 'MNRS', 'MISN' => 'MSN', 'MISSION' => 'MSN', 'MSN-R' => 'MISSION', 'MISSN' => 'MSN', 'MSN' => 'MSN', 'MSSN' => 'MSN', 'MNT' => 'MT', 'MOUNT' => 'MT', 'MT-R' => 'MOUNT', 'MT' => 'MT', 'MNTAIN' => 'MTN', 'MNTN' => 'MTN', 'MOUNTAIN' => 'MTN', 'MTN-R' => 'MOUNTAIN', 'MOUNTIN' => 'MTN', 'MTIN' => 'MTN', 'MTN' => 'MTN', 'MNTNS' => 'MTNS', 'MOUNTAINS' => 'MTNS', 'MTNS-R' => 'MOUNTAINS', 'MTNS' => 'MTNS', 'MOTORWAY' => 'MTWY', 'MTWY-R' => 'MOTORWAY', 'MOTORWY' => 'MTWY', 'MOTRWY' => 'MTWY', 'MOTWY' => 'MTWY', 'MTRWY' => 'MTWY', 'MTWY' => 'MTWY', 'NCK' => 'NCK', 'NECK' => 'NCK', 'NCK-R' => 'NECK', 'NEK' => 'NCK', 'OPAS' => 'OPAS', 'OVERPAS' => 'OPAS', 'OVERPASS' => 'OPAS', 'OPAS-R' => 'OVERPASS', 'OVERPS' => 'OPAS', 'OVRPS' => 'OPAS', 'ORCH' => 'ORCH', 'ORCHARD' => 'ORCH', 'ORCH-R' => 'ORCHARD', 'ORCHRD' => 'ORCH', 'OVAL' => 'OVAL', 'OVAL-R' => 'OVAL', 'OVL' => 'OVAL', 'PARK' => 'PARK', 'PARK-R' => 'PARK', 'PARKS' => 'PARK', 'PK' => 'PARK', 'PRK' => 'PARK', 'PAS' => 'PASS', 'PASS' => 'PASS', 'PASS-R' => 'PASS', 'PATH' => 'PATH', 'PATH-R' => 'PATH', 'PATHS' => 'PATH', 'PIKE' => 'PIKE', 'PIKE-R' => 'PIKE', 'PIKES' => 'PIKE', 'PARKWAY' => 'PKWY', 'PKWY-R' => 'PARKWAY', 'PARKWAYS' => 'PKWY', 'PARKWY' => 'PKWY', 'PKWAY' => 'PKWY', 'PKWY' => 'PKWY', 'PKWYS' => 'PKWY', 'PKY' => 'PKWY', 'PL' => 'PL', 'PLAC' => 'PL', 'PLACE' => 'PL', 'PL-R' => 'PLACE', 'PLASE' => 'PL', 'PLAIN' => 'PLN', 'PLN-R' => 'PLAIN', 'PLN' => 'PLN', 'PLAINES' => 'PLNS', 'PLAINS' => 'PLNS', 'PLNS-R' => 'PLAINS', 'PLNS' => 'PLNS', 'PLAZ' => 'PLZ', 'PLAZA' => 'PLZ', 'PLZ-R' => 'PLAZA', 'PLZ' => 'PLZ', 'PLZA' => 'PLZ', 'PZ' => 'PLZ', 'PINE' => 'PNE', 'PNE-R' => 'PINE', 'PNE' => 'PNE', 'PINES' => 'PNES', 'PNES-R' => 'PINES', 'PNES' => 'PNES', 'PR' => 'PR', 'PRAIR' => 'PR', 'PRAIRIE' => 'PR', 'PR-R' => 'PRAIRIE', 'PRARE' => 'PR', 'PRARIE' => 'PR', 'PRR' => 'PR', 'PRRE' => 'PR', 'PORT' => 'PRT', 'PRT-R' => 'PORT', 'PRT' => 'PRT', 'PORTS' => 'PRTS', 'PRTS-R' => 'PORTS', 'PRTS' => 'PRTS', 'PASG' => 'PSGE', 'PASSAGE' => 'PSGE', 'PSGE-R' => 'PASSAGE', 'PASSG' => 'PSGE', 'PSGE' => 'PSGE', 'PNT' => 'PT', 'POINT' => 'PT', 'PT-R' => 'POINT', 'PT' => 'PT', 'PNTS' => 'PTS', 'POINTS' => 'PTS', 'PTS-R' => 'POINTS', 'PTS' => 'PTS', 'RAD' => 'RADL', 'RADIAL' => 'RADL', 'RADL-R' => 'RADIAL', 'RADIEL' => 'RADL', 'RADL' => 'RADL', 'RAMP' => 'RAMP', 'RAMP-R' => 'RAMP', 'RD' => 'RD', 'ROAD' => 'RD', 'RD-R' => 'ROAD', 'RDG' => 'RDG', 'RDGE' => 'RDG', 'RIDGE' => 'RDG', 'RDG-R' => 'RIDGE', 'RDGS' => 'RDGS', 'RIDGES' => 'RDGS', 'RDGS-R' => 'RIDGES', 'RDS' => 'RDS', 'ROADS' => 'RDS', 'RDS-R' => 'ROADS', 'RIV' => 'RIV', 'RIVER' => 'RIV', 'RIV-R' => 'RIVER', 'RIVR' => 'RIV', 'RVR' => 'RIV', 'RANCH' => 'RNCH', 'RNCH-R' => 'RANCH', 'RANCHES' => 'RNCH', 'RNCH' => 'RNCH', 'RNCHS' => 'RNCH', 'RAOD' => 'RD', 'ROW' => 'ROW', 'ROW-R' => 'ROW', 'RAPID' => 'RPD', 'RPD-R' => 'RAPID', 'RPD' => 'RPD', 'RAPIDS' => 'RPDS', 'RPDS-R' => 'RAPIDS', 'RPDS' => 'RPDS', 'REST' => 'RST', 'RST-R' => 'REST', 'RST' => 'RST', 'ROUTE' => 'RTE', 'RTE-R' => 'ROUTE', 'RT' => 'RTE', 'RTE' => 'RTE', 'RUE' => 'RUE', 'RUE-R' => 'RUE', 'RUN' => 'RUN', 'RUN-R' => 'RUN', 'SHL' => 'SHL', 'SHOAL' => 'SHL', 'SHL-R' => 'SHOAL', 'SHOL' => 'SHL', 'SHLS' => 'SHLS', 'SHOALS' => 'SHLS', 'SHLS-R' => 'SHOALS', 'SHOLS' => 'SHLS', 'SHOAR' => 'SHR', 'SHORE' => 'SHR', 'SHR-R' => 'SHORE', 'SHR' => 'SHR', 'SHOARS' => 'SHRS', 'SHORES' => 'SHRS', 'SHRS-R' => 'SHORES', 'SHRS' => 'SHRS', 'SKWY' => 'SKWY', 'SKYWAY' => 'SKWY', 'SKWY-R' => 'SKYWAY', 'SKYWY' => 'SKWY', 'SMT' => 'SMT', 'SUMIT' => 'SMT', 'SUMITT' => 'SMT', 'SUMMIT' => 'SMT', 'SMT-R' => 'SUMMIT', 'SUMT' => 'SMT', 'SPG' => 'SPG', 'SPNG' => 'SPG', 'SPRING' => 'SPG', 'SPG-R' => 'SPRING', 'SPRNG' => 'SPG', 'SPGS' => 'SPGS', 'SPNGS' => 'SPGS', 'SPRINGS' => 'SPGS', 'SPGS-R' => 'SPRINGS', 'SPRNGS' => 'SPGS', 'SPR' => 'SPUR', 'SPRS' => 'SPUR', 'SPUR' => 'SPUR', 'SPUR-R' => 'SPUR', 'SPURS' => 'SPUR', 'SQ' => 'SQ', 'SQAR' => 'SQ', 'SQR' => 'SQ', 'SQRE' => 'SQ', 'SQU' => 'SQ', 'SQUARE' => 'SQ', 'SQ-R' => 'SQUARE', 'SQARS' => 'SQS', 'SQRS' => 'SQS', 'SQS' => 'SQS', 'SQUARES' => 'SQS', 'SQS-R' => 'SQUARES', 'ST' => 'ST', 'STR' => 'ST', 'STREET' => 'ST', 'ST-R' => 'STREET', 'STRT' => 'ST', 'STA' => 'STA', 'STATION' => 'STA', 'STA-R' => 'STATION', 'STATN' => 'STA', 'STN' => 'STA', 'STRA' => 'STRA', 'STRAV' => 'STRA', 'STRAVE' => 'STRA', 'STRAVEN' => 'STRA', 'STRAVENUE' => 'STRA', 'STRA-R' => 'STRAVENUE', 'STRAVN' => 'STRA', 'STRVN' => 'STRA', 'STRVNUE' => 'STRA', 'STREAM' => 'STRM', 'STRM-R' => 'STREAM', 'STREME' => 'STRM', 'STRM' => 'STRM', 'STREETS' => 'STS', 'STS-R' => 'STREETS', 'STS' => 'STS', 'TER' => 'TER', 'TERACE' => 'TER', 'TERASE' => 'TER', 'TERR' => 'TER', 'TERRACE' => 'TER', 'TER-R' => 'TERRACE', 'TERRASE' => 'TER', 'TERRC' => 'TER', 'TERRICE' => 'TER', 'TPK' => 'TPKE', 'TPKE' => 'TPKE', 'TRNPK' => 'TPKE', 'TRPK' => 'TPKE', 'TURNPIKE' => 'TPKE', 'TPKE-R' => 'TURNPIKE', 'TURNPK' => 'TPKE', 'TRACK' => 'TRAK', 'TRAK-R' => 'TRACK', 'TRACKS' => 'TRAK', 'TRAK' => 'TRAK', 'TRK' => 'TRAK', 'TRKS' => 'TRAK', 'TRACE' => 'TRCE', 'TRCE-R' => 'TRACE', 'TRACES' => 'TRCE', 'TRCE' => 'TRCE', 'TRAFFICWAY' => 'TRFY', 'TRFY-R' => 'TRAFFICWAY', 'TRAFFICWY' => 'TRFY', 'TRAFWAY' => 'TRFY', 'TRFCWY' => 'TRFY', 'TRFFCWY' => 'TRFY', 'TRFFWY' => 'TRFY', 'TRFWY' => 'TRFY', 'TRFY' => 'TRFY', 'TR' => 'TRL', 'TRAIL' => 'TRL', 'TRL-R' => 'TRAIL', 'TRAILS' => 'TRL', 'TRL' => 'TRL', 'TRLS' => 'TRL', 'THROUGHWAY' => 'TRWY', 'TRWY-R' => 'THROUGHWAY', 'THROUGHWY' => 'TRWY', 'THRUWAY' => 'TRWY', 'THRUWY' => 'TRWY', 'THRWAY' => 'TRWY', 'THRWY' => 'TRWY', 'THWY' => 'TRWY', 'TRWY' => 'TRWY', 'TUNEL' => 'TUNL', 'TUNL' => 'TUNL', 'TUNLS' => 'TUNL', 'TUNNEL' => 'TUNL', 'TUNL-R' => 'TUNNEL', 'TUNNELS' => 'TUNL', 'TUNNL' => 'TUNL', 'UN' => 'UN', 'UNION' => 'UN', 'UN-R' => 'UNION', 'UNIONS' => 'UNS', 'UNS-R' => 'UNIONS', 'UNS' => 'UNS', 'UDRPS' => 'UPAS', 'UNDERPAS' => 'UPAS', 'UNDERPASS' => 'UPAS', 'UPAS-R' => 'UNDERPASS', 'UNDERPS' => 'UPAS', 'UNDRPAS' => 'UPAS', 'UNDRPS' => 'UPAS', 'UPAS' => 'UPAS', 'VDCT' => 'VIA', 'VIA' => 'VIA', 'VIADCT' => 'VIA', 'VIADUCT' => 'VIA', 'VIA-R' => 'VIADUCT', 'VIS' => 'VIS', 'VIST' => 'VIS', 'VISTA' => 'VIS', 'VIS-R' => 'VISTA', 'VST' => 'VIS', 'VSTA' => 'VIS', 'VILLE' => 'VL', 'VL-R' => 'VILLE', 'VL' => 'VL', 'VILG' => 'VLG', 'VILL' => 'VLG', 'VILLAG' => 'VLG', 'VILLAGE' => 'VLG', 'VLG-R' => 'VILLAGE', 'VILLG' => 'VLG', 'VILLIAGE' => 'VLG', 'VLG' => 'VLG', 'VILGS' => 'VLGS', 'VILLAGES' => 'VLGS', 'VLGS-R' => 'VILLAGES', 'VLGS' => 'VLGS', 'VALLEY' => 'VLY', 'VLY-R' => 'VALLEY', 'VALLY' => 'VLY', 'VALY' => 'VLY', 'VLLY' => 'VLY', 'VLY' => 'VLY', 'VALLEYS' => 'VLYS', 'VLYS-R' => 'VALLEYS', 'VLYS' => 'VLYS', 'VIEW' => 'VW', 'VW-R' => 'VIEW', 'VW' => 'VW', 'VIEWS' => 'VWS', 'VWS-R' => 'VIEWS', 'VWS' => 'VWS', 'WALK' => 'WALK', 'WALK-R' => 'WALK', 'WALKS' => 'WALK', 'WLK' => 'WALK', 'WALL' => 'WALL', 'WALL-R' => 'WALL', 'WAY' => 'WAY', 'WAY-R' => 'WAY', 'WY' => 'WAY', 'WAYS' => 'WAYS', 'WAYS-R' => 'WAYS', 'WEL' => 'WL', 'WELL' => 'WL', 'WL-R' => 'WELL', 'WL' => 'WL', 'WELLS' => 'WLS', 'WLS-R' => 'WELLS', 'WELS' => 'WLS', 'WLS' => 'WLS', 'CROSING' => 'XING', 'CROSNG' => 'XING', 'CROSSING' => 'XING', 'XING-R' => 'CROSSING', 'CRSING' => 'XING', 'CRSNG' => 'XING', 'CRSSING' => 'XING', 'CRSSNG' => 'XING', 'XING' => 'XING', 'CROSRD' => 'XRD', 'CROSSRD' => 'XRD', 'CROSSROAD' => 'XRD', 'XRD-R' => 'CROSSROAD', 'CRSRD' => 'XRD', 'XRD' => 'XRD', 'XROAD' => 'XRD', ); /** * An array with things that look like street types but are actually names * * @var array */ public $suffixSimiles = array( 'LA' => 'LA', 'ST' => 'SAINT', 'VIA' => 'VIA', ); /** * Formats a Delivery Address Line according to the United States Postal * Service's Addressing Standards * * This comes in VERY handy when searching for records by address. * Let's say a data entry person put an address in as * "Two N Boulevard." Later, someone else searches for them using * "2 North Blvd." Unfortunately, that query won't find them. Such * problems are averted by using this method before storing and * searching for data. * * Standardization can also help obtain lower bulk mailing rates. * * Based upon USPS Publication 28, November 1997. * * @param string $address the address to be converted * * @return string the cleaned up address * * @link http://pe.usps.gov/cpim/ftp/pubs/Pub28/pub28.pdf */ public function AddressLineStandardization($address) { if (empty($address)) { return ''; } /* * General input sanitization. */ $address = strtoupper($address); // Replace bogus characters with spaces. $address = preg_replace('@[^A-Z0-9 /#.-]@', ' ', $address); // Remove starting and ending spaces. $address = trim($address); // Remove periods from ends. $address = preg_replace('@\.$@', '', $address); // Add spaces around hash marks to simplify later processing. $address = str_replace('#', ' # ', $address); // Remove duplicate separators and spacing around separators, // simplifying the next few steps. $address = preg_replace('@ *([/.-])+ *@', '\\1', $address); // Remove dashes between numberic/non-numerics combinations // at ends of lines (for apartment numbers "32-D" -> "32D"). $address = preg_replace('@(?<=[0-9])-(?=[^0-9]+$)@', '', $address); $address = preg_replace('@(?<=[^0-9])-(?=[0-9]+$)@', '', $address); // Replace remaining separators with spaces. $address = preg_replace('@(?<=[^0-9])[/.-](?=[^0-9])@', ' ', $address); $address = preg_replace('@(?<=[0-9])[/.-](?=[^0-9])@', ' ', $address); $address = preg_replace('@(?<=[^0-9])[/.-](?=[0-9])@', ' ', $address); // Remove duplilcate spaces. $address = preg_replace('@\s+@', ' ', $address); // Remove hash marks where possible. if (preg_match('@(.+ )([A-Z]+)( #)( .+)@', $address, $atom)) { if (isset($this->identifiers[$atom[2]])) { $address = "$atom[1]$atom[2]$atom[4]"; } } $address = trim($address); if (!$address) { return ''; } // Convert numeric words to integers. $parts = explode(' ', $address); foreach ($parts as $key => $val) { if (isset($this->numbers[$val])) { $parts[$key] = $this->numbers[$val]; } } $address = implode(' ', $parts); unset($parts); $address = preg_replace('@ ([0-9]+)(ST|ND|RD|TH)? ?(?>FLOOR|FLR|FL)(?! [0-9])@', ' FL \\1', $address); $address = preg_replace('@(NORTH|SOUTH) (EAST|WEST)@', '\\1\\2', $address); /* * Check for special addresses. */ $rural_alternatives = 'RR|RFD ROUTE|RURAL ROUTE|RURAL RTE|RURAL RT|RURAL DELIVERY|RD ROUTE|RD RTE|RD RT'; if (preg_match('@^(' . $rural_alternatives . ') ?([0-9]+)([A-Z #]+)([0-9A-Z]+)(.*)$@', $address, $atom)) { return "RR $atom[2] BOX $atom[4]"; } if (preg_match('@^(BOX|BX)([ #]*)([0-9A-Z]+) (' . $rural_alternatives . ') ?([0-9]+)(.*)$@', $address, $atom)) { return "RR $atom[5] BOX $atom[3]"; } if (preg_match('@^((((POST|P) ?(OFFICE|O) ?)?(BOX|BX|B) |(POST|P) ?(OFFICE|O) ?)|FIRM CALLER|CALLER|BIN|LOCKBOX|DRAWER)( ?(# )*)([0-9A-Z-]+)(.*)$@', $address, $atom)) { return "PO BOX $atom[11]"; } $highway_alternatives = 'HIGHWAY|HIGHWY|HIWAY|HIWY|HWAY|HWY|HYGHWAY|HYWAY|HYWY'; if (preg_match('@^([0-9A-Z.-]+ ?[0-9/]* ?)(.*)( CNTY| COUNTY) (' . $highway_alternatives . ')( NO | # | )?([0-9A-Z]+)(.*)$@', $address, $atom)) { if (isset($this->states[$atom[2]])) { $atom[2] = $this->states[$atom[2]]; } if (isset($this->identifiers[$atom[6]])) { $atom[6] = $this->identifiers[$atom[6]]; $atom[7] = str_replace(' #', '', $atom[7]); return "$atom[1]$atom[2] COUNTY HWY $atom[6]$atom[7]"; } return "$atom[1]$atom[2] COUNTY HIGHWAY $atom[6]" . $this->getEolAbbr($atom[7]); } if (preg_match('@^([0-9A-Z.-]+ ?[0-9/]* ?)(.*)( CR |( CNTY| COUNTY) (ROAD|RD))( NO | # | )?([0-9A-Z]+)(.*)$@', $address, $atom)) { if (isset($this->states[$atom[2]])) { $atom[2] = $this->states[$atom[2]]; } if (isset($this->identifiers[$atom[7]])) { $atom[7] = $this->identifiers[$atom[7]]; $atom[8] = str_replace(' #', '', $atom[8]); return "$atom[1]$atom[2] COUNTY RD $atom[7]$atom[8]"; } return "$atom[1]$atom[2] COUNTY ROAD $atom[7]" . $this->getEolAbbr($atom[8]); } if (preg_match('@^([0-9A-Z.-]+ ?[0-9/]* ?)(.*)( SR|( STATE| ST) (ROAD|RD))( NO | # | )?([0-9A-Z]+)(.*)$@', $address, $atom)) { if (isset($this->states[$atom[2]])) { $atom[2] = $this->states[$atom[2]]; } if (isset($this->identifiers[$atom[7]])) { $atom[7] = $this->identifiers[$atom[7]]; $atom[8] = str_replace(' #', '', $atom[8]); return "$atom[1]$atom[2] STATE RD $atom[7]$atom[8]"; } return "$atom[1]$atom[2] STATE ROAD $atom[7]" . $this->getEolAbbr($atom[8]); } if (preg_match('@^([0-9A-Z.-]+ ?[0-9/]* ?)(.*)( STATE| ST) (ROUTE|RTE|RT)( NO | # | )?([0-9A-Z]+)(.*)$@', $address, $atom)) { if (isset($this->states[$atom[2]])) { $atom[2] = $this->states[$atom[2]]; } if (isset($this->identifiers[$atom[6]])) { $atom[6] = $this->identifiers[$atom[6]]; $atom[7] = str_replace(' #', '', $atom[7]); return "$atom[1]$atom[2] STATE RTE $atom[6]$atom[7]"; } return "$atom[1]$atom[2] STATE ROUTE $atom[6]" . $this->getEolAbbr($atom[7]); } if (preg_match('@^([0-9A-Z.-]+ [0-9/]* ?)(INTERSTATE|INTRST|INT|I) ?(' . $highway_alternatives . '|H)? ?([0-9]+)(.*)$@', $address, $atom)) { $atom[5] = str_replace(' BYP ', ' BYPASS ', $atom[5]); return "$atom[1]INTERSTATE $atom[4]" . $this->getEolAbbr($atom[5]); } if (preg_match('@^([0-9A-Z.-]+ ?[0-9/]* ?)(.*)( STATE| ST) (' . $highway_alternatives . ')( NO | # | )?([0-9A-Z]+)(.*)$@', $address, $atom)) { if (isset($this->states[$atom[2]])) { $atom[2] = $this->states[$atom[2]]; } if (isset($this->identifiers[$atom[6]])) { $atom[6] = $this->identifiers[$atom[6]]; $atom[7] = str_replace(' #', '', $atom[7]); return "$atom[1]$atom[2] STATE HWY $atom[6]$atom[7]"; } return "$atom[1]$atom[2] STATE HIGHWAY $atom[6]" . $this->getEolAbbr($atom[7]); } if (preg_match('@^([0-9A-Z.-]+ ?[0-9/]* ?)(.*)( US| U S|UNITED STATES) (' . $highway_alternatives . ')( NO | # | )?([0-9A-Z]+)(.*)$@', $address, $atom)) { if (isset($this->states[$atom[2]])) { $atom[2] = $this->states[$atom[2]]; } if (isset($this->identifiers[$atom[6]])) { $atom[6] = $this->identifiers[$atom[6]]; $atom[7] = str_replace(' #', '', $atom[7]); return "$atom[1]$atom[2] US HWY $atom[6]$atom[7]"; } return "$atom[1]$atom[2] US HIGHWAY $atom[6]" . $this->getEolAbbr($atom[7]); } if (preg_match('@^((' . $highway_alternatives . '|H) ?(CONTRACT|C)|STAR) ?(ROUTE|RTE|RT|R)?( NO | # | )?([0-9]+) ?([A-Z]+)(.*)$@', $address, $atom)) { return "HC $atom[6] BOX" . $this->getEolAbbr($atom[8]); } if (preg_match('@^([0-9A-Z.-]+ [0-9/]* ?)(RANCH )(ROAD|RD)( NO | # | )?([0-9A-Z]+)(.*)$@', $address, $atom)) { if (isset($this->identifiers[$atom[5]])) { $atom[5] = $this->identifiers[$atom[5]]; $atom[6] = str_replace(' #', '', $atom[6]); return "$atom[1]RANCH RD $atom[5]$atom[6]"; } return "$atom[1]RANCH ROAD $atom[5]" . $this->getEolAbbr($atom[6]); } $address = preg_replace('@^([0-9A-Z.-]+) ([0-9][/][0-9])@', '\\1%\\2', $address); if (preg_match('@^([0-9A-Z/%.-]+ )(ROAD|RD)([A-Z #]+)([0-9A-Z]+)(.*)$@', $address, $atom)) { $atom[1] = str_replace('%', ' ', $atom[1]); return "$atom[1]ROAD $atom[4]" . $this->getEolAbbr($atom[5]); } if (preg_match('@^([0-9A-Z/%.-]+ )(ROUTE|RTE|RT)([A-Z #]+)([0-9A-Z]+)(.*)$@', $address, $atom)) { $atom[1] = str_replace('%', ' ', $atom[1]); return "$atom[1]ROUTE $atom[4]" . $this->getEolAbbr($atom[5]); } if (preg_match('@^([0-9A-Z/%.-]+ )(AVENUE|AVENU|AVNUE|AVEN|AVN|AVE|AV) ([A-Z]+)(.*)$@', $address, $atom)) { $atom[1] = str_replace('%', ' ', $atom[1]); return "$atom[1]AVENUE $atom[3]" . $this->getEolAbbr($atom[4]); } if (preg_match('@^([0-9A-Z/%.-]+ )(BOULEVARD|BOULV|BOUL|BLVD) ([A-Z]+)(.*)$@', $address, $atom)) { $atom[1] = str_replace('%', ' ', $atom[1]); return "$atom[1]BOULEVARD " . $this->getEolAbbr("$atom[3]$atom[4]"); } /* * Handle normal addresses. */ $parts = explode(' ', $address); $count = count($parts) - 1; $suff = 0; $id = 0; for ($counter = $count; $counter > -1; $counter--) { $out[$counter] = $parts[$counter]; if (isset($this->suffixes[$parts[$counter]])) { if (!$suff) { // The first suffix (from the right). if (!empty($out[$counter+1]) && !empty($out[$counter+2])) { switch ($out[$counter+1] . ' ' . $out[$counter+2]) { case 'EAST W': case 'WEST E': case 'NORTH S': case 'SOUTH N': // Already set. break; default: $out[$counter] = $this->suffixes[$parts[$counter]]; } } else { $out[$counter] = $this->suffixes[$parts[$counter]]; } if ($counter == $count) { $id++; } } else { // A subsequent suffix, display as full word, // but could be a name (ie: LA, SAINT or VIA). if (isset($this->suffixSimiles[$parts[$counter]]) && !isset($this->suffixes[$out[$counter+1]])) { $out[$counter] = $this->suffixSimiles[$parts[$counter]]; } else { $out[$counter] = $this->suffixes[$parts[$counter]]; $out[$counter] = $this->suffixes["$out[$counter]-R"]; } } $suff++; } elseif (isset($this->identifiers[$parts[$counter]])) { $out[$counter] = $this->identifiers[$parts[$counter]]; if ($suff > 0) { $out[$counter] = $this->identifiers["$out[$counter]-R"]; } $id++; } elseif (isset($this->directionals[$parts[$counter]])) { $prior = $counter - 1; $next = $counter + 1; if ($count >= $next && isset($this->suffixes[$parts[$next]])) { $out[$counter] = $this->directionals[$parts[$counter]]; if ($suff <= 1) { $out[$counter] = $this->directionals["$out[$counter]-R"]; } } elseif ($counter > 2 && !empty($parts[$next]) && isset($this->directionals[$parts[$next]])) { // Already set. } elseif ($counter == 2 && isset($this->directionals[$parts[$prior]])) { // Already set. } else { $out[$counter] = $this->directionals[$parts[$counter]]; } if ($counter == $count) { $id = 1; } } elseif (preg_match('@^[0-9]+$@', $parts[$counter]) && $counter > 0 && $counter < $count) { if ($suff) { switch (substr($parts[$counter], -2)) { case 11: case 12: case 13: $out[$counter] = $parts[$counter] . 'TH'; break; default: switch (substr($parts[$counter], -1)) { case 1: $out[$counter] = $parts[$counter] . 'ST'; break; case 2: $out[$counter] = $parts[$counter] . 'ND'; break; case 3: $out[$counter] = $parts[$counter] . 'RD'; break; default: $out[$counter] = $parts[$counter] . 'TH'; } } } } } $out[0] = str_replace('%', ' ', $out[0]); ksort($out); return implode(' ', $out); } /** * Implement abbreviations for words at the ends of certain address lines * * @param string $string the address fragments to be analyzed * * @return string the cleaned up string */ private function getEolAbbr($string) { $suff = 0; $id = 0; $parts = explode(' ', $string); $count = count($parts) - 1; for ($counter = $count; $counter > -1; $counter--) { if (isset($this->suffixes[$parts[$counter]])) { if (!$suff) { $out[$counter] = $this->suffixes[$parts[$counter]]; $suff++; if ($counter == $count) { $id = 1; } } else { $out[$counter] = $parts[$counter]; } } elseif (isset($this->identifiers[$parts[$counter]])) { $out[$counter] = $this->identifiers[$parts[$counter]]; $id = 1; } elseif (isset($this->directionals[$parts[$counter]])) { $out[$counter] = $this->directionals[$parts[$counter]]; if ($counter == $count) { $id = 1; } } else { $out[$counter] = $parts[$counter]; } } ksort($out); return implode(' ', $out); } /** * Generates a XHTML option list of states * * @param mixed $default string or array of values to be selected * @param string $name the name attribute for the form element * @param string $visible what users see in the list: * Word (names) * or Abbr (initials) * @param string $value values for the options: * Word (names) * or Abbr (initials) * @param string $class class attribute for the ' . "\n"; if (is_array($default)) { $default_clean = array(); foreach ($default as $val) { if (is_string($val)) { $default_clean[] = strtoupper($val); } } } else { if (is_string($default)) { $default_clean = array(strtoupper($default)); } else { $default_clean = array(); } } } else { echo 'name="' . $name . '">' . "\n"; if (is_array($default)) { $default_clean = array(strtoupper(current($default))); } else { if (is_string($default)) { $default_clean = array(strtoupper($default)); } else { $default_clean = array(); } } } foreach ($this->states as $Word => $Abbr) { echo ' \n"; } echo "\n\n"; } }