用于状态缩写的PHP正则表达式

时间:2012-02-03 18:24:12

标签: php regex

我意识到这不是“让我成为一个正则表达式”网站,但我老实说试图在我自己解决这个问题一段时间。我对正则表达式很糟糕。

基本上,我正在解析位置搜索的查询,其中可能包括各种变体,如“区域,城市,州,邮编”以及介于两者之间的所有内容(带或不带逗号),缩写状态或拼写等。

我正在努力使用州名缩写。主要是因为它并不总是像“VA”那样在任何一侧都有空格,而是它可能是字符串的结尾。我一直在RegEx tool测试这些,这里有一对我试过的“VA”:

  

/(VA)(\ s | \ n | \ r)/< - 完全没有工作

     

/(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');

稍后在我的代码中,我循环遍历这些并尝试在我的$查询中匹配它们,这是用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);
   }
}

我意识到更有效的方法是找到隔离的2个字符块,然后与我的数组进行比较,但目前,我只是在进行测试以确保我甚至可以获取缩写。

3 个答案:

答案 0 :(得分:5)

在缩写词周围使用单词边界:

/\b(VA)\b/

一般正则表达式:

/\b([A-Z]{2})\b/

将您的代码更改为:

$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);
   }
}

答案 1 :(得分:3)

正则表达式中的行尾字符为$,行尾字符为^,因此这可能是您要查找的内容:

/(^|[ ,])[A-Z]{2}($|[ ,])/

这将匹配:

  • 行首,空格,逗号
  • ...后跟2个大写字母
  • ...后跟行尾,空格,逗号

答案 2 :(得分:0)

/\s+[A-Z]{2}\s+/ 

将匹配两个带有明确(一个或多个)空格的大写字母

相关问题