我有一个搜索地址数据库的应用程序。页面访问者输入他或她的地址,应用程序将告诉他们是否已连接。
包含他们应搜索的信息的数据库的相关部分是:
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”将不匹配任何东西,这将是相当不错的。
申请表格应该有三个搜索字段而不是一个,这也是非常不可取的,所以in-data是一个字符串。
现在,正如您所看到的,尽管是输入地址的合法方式,但上述搜索字词之一将会失败。它是地址的数字和字母之间的空格。
所以我写了这个正则表达式以捕获所有传入的搜索,并希望按摩它们是正确的:
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
)
你们是否有关于全能表达式的任何指针,或者你建议在regexp之前进行更多if / else捕获?任何意见都表示赞赏。
谢谢!
答案 0 :(得分: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 )
答案 1 :(得分:1)
这个怎么样:
'Storagatan34B'
searchcolumn LIKE <input> + '%'
当然,除了空格,你还可以删除你想忽略的其他字符。只需确保您为搜索列和输入使用相同的替换方案。