zerodahero / address-normalization
将邮寄地址转换为标准化格式
3.0.1
2024-02-22 21:22 UTC
Requires
- php: >=8.0
Requires (Dev)
- phpunit/phpunit: ^9.5
README
目的
本软件包的主要目的是作为地址标准化和规范化的第一层。推荐的使用方法是预先解析/规范化地址,然后使用哈希函数与现有的缓存/记录集进行比较。
一种无需外部服务即可规范美国邮寄地址的方法。这是由 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