EDIT:看起来第一组数字和“华盛顿”之间的[任何]数据必须更加严格才能正常工作。 [anything] 部分不应包含任何数字,因为数字是我们用来分隔其中一个地址的开头的数字。这适用于您提供给我们的三个网站。
我想说最好的第一步是删除所有 HTML 标签并替换 ' ' 字符实体:
$input = strip_tags($input);
$input = preg_replace("/ /"," ",$input);
那么如果地址匹配(接近)您指定的格式,请执行以下操作:
$results= array();
preg_match("/[0-9]+\s+[^0-9]*?\s+washington,?\s*D\.?C\.?[^0-9]+[0-9]{5}/si",$input,$results);
foreach($result[0] as $addr){
echo "$addr<br/>";
}
这适用于您提供的三个示例,并且$results[0]
应包含找到的每个地址。
但是,例如,如果地址中有“公寓#2”或类似内容,则此方法不起作用,因为它假定最接近“华盛顿特区”的数字标记地址的开头。
以下脚本匹配每个测试用例:
<?php
$input = "
1433 Longworth House Office Building Washington, D.C. 20515
332 Cannon HOB Washington DC 20515
1641 LONGWORTH HOUSE OFFICE BUILDING WASHINGTON, DC 20515
1238 Cannon H.O.B.
Washington, DC 20515
8293 Longworth House Office Building • Washington DC • 20515
8293 Longworth House Office Building | Washington DC | 20515
";
$input = strip_tags($input);
$input = preg_replace("/ /"," ",$input);
$results= array();
preg_match_all("/[0-9]+\s+[^0-9]*?washington,?\s*D\.?C\.?[^0-9]*?[0-9]{5}/si",$input,$results);
foreach($results[0] as $addr){
echo "$addr<br/>";
}