【问题标题】:Format address search with regular expression使用正则表达式格式化地址搜索
【发布时间】:2011-11-25 08:47:45
【问题描述】:

我有一个搜索地址数据库的应用程序。页面访问者输入他或她的地址,应用程序会告诉他们他们是否已连接。

包含他们应该搜索的信息的数据库的相关部分是:

streetname      "Stora gatan"
streetnumber    "34"
streetletter    "B"
address         "Stora gatan 34B"

此数据库由我的客户提供,并且如您所见,格式整齐。访问者搜索的绝大多数数据是:

"Stora gatan"
"Stora gatan 34"
"Stora gatan 34b"
"Stora gatan 34 b"

这些是我目前感兴趣的唯一格式。这是一个瑞典应用程序,这就是在瑞典格式化/键入地址的方式。上述的任何狂野版本(例如,如果用户应该搜索“34 Storgatan B”将不会匹配任何内容,这很好。

申请表应该有三个搜索字段而不是一个也是非常不理想的,因此输入数据在一个字符串中。

现在,如您所见,尽管输入地址是一种合法的方式,但上述搜索词之一将失败。这是地址的数字和字母之间有空格的那个。

所以我写了这个正则表达式来捕捉所有传入的搜索,并希望它们是正确的:

if (preg_match("/^(.*?)\s*(\d*?)\s*([A-Za-z]*?)$/", $address, $m)){
    $streetname = uc_words($m[1]);
    $streetnumber = trim($m[2]);
    $streetletter = strtoupper($m[3]);
    $search = trim($streetname . SPACE . $streetnumber . $streetletter);
}

不幸的是,这并没有像我希望的那样真正起作用。对于上面的每个示例,生成的 $m 将如下所示:

错误:

Array
(
    [0] => Stora gatan
    [1] => Stora
    [2] => 
    [3] => gatan
)

正确:

Array
(
    [0] => Stora gatan 34
    [1] => Stora gatan
    [2] => 34
    [3] => 
)

正确:

Array
(
    [0] => Stora gatan 34b
    [1] => Stora gatan
    [2] => 34
    [3] => b
)

你们是否有任何关于包罗万象的表达式的指示,或者你会建议在正则表达式之前做更多的 if/else 捕捉吗?任何意见表示赞赏。

谢谢!

【问题讨论】:

  • 这或多或少是不可能的。人们以许多不同的方式写地址(顺便说一下,这里是挪威)。我宁愿选择用户填写的多个字段。街道地址、号码等。如果用户在地址后键入逗号怎么办?这不会使您的正则表达式崩溃吗?

标签: php regex search street-address


【解决方案1】:

试试这个(不是最漂亮的正则表达式,但它有效):

$address = "Stora gatan 34 b";
preg_match("/([a-zA-Z ]+) ?([0-9]+)? ?([a-zA-Z]+)?/", $address, $m);

print_r($m);

结果:

$address = "Stora gatan 34 b";
Array ( [0] => Stora gatan 34 b [1] => Stora gatan [2] => 34 [3] => b ) 

$address = "Stora gatan 34b";
Array ( [0] => Stora gatan 34b [1] => Stora gatan [2] => 34 [3] => b ) 

$address = "Stora gatan 34";
Array ( [0] => Stora gatan 34 [1] => Stora gatan [2] => 34 ) 

$address = "Stora gatan";
Array ( [0] => Stora gatan [1] => Stora gatan ) 

$address = "Stora 34 b";
Array ( [0] => Stora 34 b [1] => Stora [2] => 34 [3] => b ) 

【讨论】:

  • 那个正则表达式没什么问题...你真的可以让它更小吗?
【解决方案2】:

这个怎么样:

  • 创建一个包含不带空格的地址的列:'Storagatan34B'
  • 在搜索之前删除用户输入字符串中的所有空格
  • 使用searchcolumn LIKE <input> + '%'

当然,除了空格之外,您还可以删除您希望忽略的其他字符。只需确保您对搜索列和输入使用相同的替换方案即可。

【讨论】:

  • 也是一个很好的建议,但它是一个大型数据库,除非我别无选择,否则我宁愿保持这种状态。
猜你喜欢
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多