从字符串返回数字

时间:2013-10-08 05:42:47

标签: php regex preg-match

在PHP中如何确定字符串中是否存在邮政编码,如果存在,则返回邮政编码。在这种情况下,邮政编码可以是5个数字的字符串(即“55543”),也可以是5个数字的字符串,连接4个带连字符的数字(即“74657-9993”)..

任何人都可以帮我解决我可以使用preg_match或其他任何好方法的正则表达式模式吗?

到目前为止,我有preg_match_all("/\d{5}/", $str, $matches);,但这并未考虑可能的第二个4位数或连字符。

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位数字。

regex101 demo

答案 1 :(得分:2)

你的模式是

\b\d{5}(?:-\d{4})?\b

here on Regexr

此处的一个重要部分是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})?)$/;