在PHP中如何确定字符串中是否存在邮政编码,如果存在,则返回邮政编码。在这种情况下,邮政编码可以是5个数字的字符串(即“55543”),也可以是5个数字的字符串,连接4个带连字符的数字(即“74657-9993”)..
任何人都可以帮我解决我可以使用preg_match
或其他任何好方法的正则表达式模式吗?
到目前为止,我有preg_match_all("/\d{5}/", $str, $matches);
,但这并未考虑可能的第二个4位数或连字符。
答案 0 :(得分:3)
5个数字用连字符连接4个数字:
preg_match_all("/\b\d{5}(?:-\d{4})?\b/", $str, $matches);
(?:-\d{4,})?
是一个可选组,带有连字符,后面至少有4位数。
编辑:使用单词边界忘记防止第一部分超过5位(第二部分为4位)。
EDIT2:
好的,我刚注意到的另一件事是,如果你有12345-12345
但又不想从任何号码形成这个,你可以使用:
preg_match_all("/\b\d{5}(?!-\d{1,3}\b|-\d{5})(?:-\d{4})?\b/", $str, $matches);
否定前瞻会阻止-12345
(或更多位数,或少于4位数)的匹配(如果存在),但只允许4位数字。
答案 1 :(得分:2)
你的模式是
\b\d{5}(?:-\d{4})?\b
此处的一个重要部分是word boundaries \b
,它们确保不会匹配数字的一部分。
\d{5}
正匹配5位数字
(?:-\d{4})?
是可选部分(由于<{1}} 之后该组)。该组开头的?
只是使group无法捕获。
答案 2 :(得分:0)
只需修改你的正则表达式以允许可选的前缀:
preg_match_all("/\d{5}(\-\d{4})?/", $str, $matches);
答案 3 :(得分:0)
我最近在javascript中实现了这个
/^(\s*|\d{5}([\-]\d{4})?)$/;