2011-11-25 23 views
1

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

包含应搜索对信息的数据库的相关部分:

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捕获?任何输入赞赏。

谢谢!

+0

这或多或少是不可能的。人们用很多不同的方式写地址(顺便说一下,挪威在这里)。我宁愿去用户填写的多个字段。Streetadress,号码等等。如果用户在地址后输入逗号,该怎么办?这不会使你的正则表达式崩溃吗? – OptimusCrime

回答

2

试试这个(不是最漂亮的正则表达式,但它的工作原理):

$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) 
+0

那个正则表达式没什么问题......你真的可以把它变得更小吗? –

+0

非常感谢! – Sandman

1

如何:

  • 创建一个包含不带空格的地址栏:'Storagatan34B'
  • remove从用户输入字符串的所有空间用户搜索前
  • 使用searchcolumn LIKE <input> + '%'

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

+0

也是一个很好的建议,但它是一个大型数据库,我宁愿保持这种方式,除非我没有其他选择。 – Sandman