正则是从字符串中提取城市和状态,并知道何时有人遗漏了州的一部分



我有以下代码:

preg_match("/^(.+)[,\s]+(.+?)s*(d{5})?$/", trim($searchbox), $matches);
list($arr['add'], $arr['city'], $arr['state']) = $matches;
$citystr = trim(str_replace(',', '', $arr['city']));
$statestr = trim($arr['state']);

当有人在"加利福尼亚州的花岗岩湾"中键入" Granite Bay"时,这效果很好,但是我想将其修改为当有人忽略" CA"部分时捕获。因此,如果某人仅类型"花岗岩湾",上面的代码将"湾"作为状态作为状态 - 那是不好的。如果有人将拉链添加到末端,也会失败。

我可以做任何修改以避免这两个senarios吗?

tia

是的,您可以构建一个较低的允许/更详细的模式:

^h*([^,s]+(?:h+[^,s]+)*+)h*(?:,h*([A-Z]+))?h*(d{5})?h*$

演示

([^,s]+(?:h+[^,s]+)*+)将城市名称捕获为:没有启动的东西也不以惠特为终点,最终在几个部分中。

(?:,h*([A-Z]+))?使所有状态部分可选。请注意,我仅选择了国家的大写字母,但是您也可以使其案例不敏感,这没关系,因为重要的一点是逗号。

顺便说一句,如果您想确定输入用户的内容,请使用每个信息(一个用于城市的一个字段,一个用于州,一个用于邮政编码)。

您可以去:

^                       # start of the string
(?P<town>[A-Z][^,]+)    # uppercase, followed by not a comma
(?>                     # a non-capturing group
    ,h*K              # a comma, horizontal whitespace, K
    (?P<state>[A-Z]{2}) # two UPPERCASE letters
)?                      # make the whole group optional

请参阅 REGEX101.com上的演示
可以肯定的是,您可能需要一些城镇和州的数据库进行检查(上面的表达式也允许 XY用于状态),或如@casimir指出的那样,对每个信息使用多个字段。

最新更新