我意识到这不是"让我成为一个正则表达式"的网站,但我老实说试图在我自己解决这个问题一段时间.我对正则表达式很糟糕.
基本上,我正在解析位置搜索的查询,其中可能包括各种变体,如"区域,城市,州,邮编"以及介于两者之间的所有内容(带或不带逗号),缩写状态或拼写等.
我正在努力与州缩写.主要是因为它并不总是像"VA"那样在任何一侧都有空格,而是它可能是字符串的结尾.我一直在用RegEx工具测试这些,这里有一对我试过的"VA":
/(VA)(\ s | \n |\r)/ < - DOESNT全部工作
/(VA)[^ A-Z0-9]*/< - 在最后允许数字和字母结束
我想我只需要一些关于如何做到这一点的指导?
[编辑] @Igor Korghov
我有一系列带有海岸线的州缩写:
$stateAbbreviations = Array('AL','AK','CA','CT','DE','FL','GA','HI','LA','ME','NH','NJ','NY','NC','OR','MD','MA','MS','RI','SC','TX','VA','WA');
Run Code Online (Sandbox Code Playgroud)
稍后在我的代码中,我循环遍历这些并尝试在我的$查询中匹配它们,这是用strtoupper()大写的.
$query = "LESNER BRIDGE, VIRGINIA BEACH, VA 23453";
foreach($this->stateAbbreviations as $state)
{
if(preg_match("/( VA)[^A-Z0-9]*/", $query, $match))
{
var_dump($match);
}
}
Run Code Online (Sandbox Code Playgroud)
我意识到一种更有效的方法是找到隔离的2个字符块,然后与我的数组进行比较,但目前,我只是搞乱测试以确保我甚至可以抓住缩写.
在缩写周围使用单词边界:
/\b(VA)\b/
Run Code Online (Sandbox Code Playgroud)
一般正则表达式:
/\b([A-Z]{2})\b/
Run Code Online (Sandbox Code Playgroud)
将您的代码更改为:
$stateAbbreviations = Array('AL','AK','CA','CT','DE','FL','GA','HI','LA','ME','NH','NJ','NY','NC','OR','MD','MA','MS','RI','SC','TX','VA','WA');
$query = "LESNER BRIDGE, VIRGINIA BEACH, VA 23453";
foreach($this->stateAbbreviations as $state) {
if(preg_match("/\b($state)\b/", $query, $match)) {
var_dump($match);
}
}
Run Code Online (Sandbox Code Playgroud)