zerodahero/address-normalization

将邮寄地址转换为标准化格式

3.0.1 2024-02-22 21:22 UTC

This package is auto-updated.

Last update: 2024-09-22 22:26:25 UTC


README

Build Status

目的

本软件包的主要目的是作为地址标准化和规范化的第一层。推荐的使用方法是预先解析/规范化地址,然后使用哈希函数与现有的缓存/记录集进行比较。

一种无需外部服务即可规范美国邮寄地址的方法。这是由 Schuyler D. Erle 编写的 perl 模块 Geo::StreetAddress::US 的移植版本。

这是从 khartnett/address-normalization 分支出来的——感谢原作者的辛勤工作!

局限性

这是一个非常基本的规范器。它实际上仅处理基于美国的地址,不应被认为是严格的地址到地址比较的可靠工具。这个规范器不验证地址的有效性!如果您依赖于准确的地址,您必须使用其他方式(很可能是一个第三方服务)来验证地址。

为什么?

我分支并添加了功能到这个软件包,因为我需要在将地址发送到我们的规范化服务之前进行预规范化。这有助于我们限制调用次数和对服务的严格依赖,同时还可以让我们在这里和那里捕获一些易于匹配的场景,从而提供更好的用户体验。

替代方案

Libpostal 可能是这个领域的最佳选择。我决定不使用 Libpostal,原因如下:(1)它需要几个 Gb 的空间,这在我的当前环境中是不可取的,并且(2)它可能过于强大,因为我认为我们的第三方服务在这方面已经是权威的。

安装

composer require zerodahero/address-normalization

使用方法

规范化

<?php
use ZeroDaHero\Normalizer;
$normalizer = new Normalizer();

// This returns a \ZeroDaHero\Address object with the parsed components
$address = $normalizer->parse('204 southeast Smith Street Harrisburg, or 97446');

$address->getAddressComponents();
/* output:
[
    "number" => "204",
    "street" => "Smith",
    "street_type" => "St",
    "unit" => "",
    "unit_prefix" => "",
    "suffix" => "",
    "prefix" => "SE",
    "city" => "Harrisburg",
    "state" => "OR",
    "postal_code" => "97446",
    "postal_code_ext" => null,
    "street_type2" => null,
    "prefix2" => null,
    "suffix2" => null,
    "street2" => null,
] */

$address->toString();
/* string_result:
"204 SE Smith St, Harrisburg, OR 97446"
*/

比较

<?php
use ZeroDaHero\Normalizer;
$normalizer = new Normalizer();

$address1 = $normalizer->parse('204 southeast Smith Street Harrisburg, or 97446');
$address2 = $normalizer->parse('204 SE Smith St. Harrisburg, Oregon 97446');
// Same street, different number
$address3 = $normalizer->parse('207 SE Smith St. Harrisburg, Oregon 97446');

$address1->is($address2); // true
$address2->is($address3); // false
$address1->isSameStreet($address3); // true

// or can compare hashes directly
$address1->getFullHash() === $address2->getFullHash(); // true

格式化

<?php
use ZeroDaHero\Normalizer;
$normalizer = new Normalizer();

$address = $normalizer->parse('204 southeast Smith Street Harrisburg, or 97446');

$address->toString();
// or
(string) $address;
/* string:
  "204 SE Smith St, Harrisburg, OR 97446"
*/

$address->toArray();
/* array:
  [
    '204 SE Smith St',
    'Harrisburg, OR 97446'
  ]

哈希

如果您只需要使用一种一致的哈希方式(例如,如果您从一个可靠的第三方服务开始,例如一个5部分地址),您可以构建一个 SimpleAddress

<?php
use ZeroDaHero\SimpleAddress;

$address = new SimpleAddress('1234 Main St NE', null, 'Minneapolis', 'MN', '55401');
$address->getHash(); // full hash minus zip
$address->getFullHash(); // full hash including zip

// or do it all with the factory method:
SimpleAddress::hashFromParts('1234 Main St NE', null, 'Minneapolis', 'MN', '55401');

// CANNOT hash street, since the component parts don't exist
$address->getStreetHash(); // throws exception