我有以下代码:
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指出的那样,对每个信息使用多个字段。