0

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

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

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

4

4 回答 4

3

5 个数字用连字符连接到另外 4 个数字:

preg_match_all("/\b\d{5}(?:-\d{4})?\b/", $str, $matches);

(?:-\d{4,})?是一个可选组,带有连字符,后面至少有 4 位数字。

编辑:忘记使用单词边界防止第一部分超过 5 位(第二部分超过 4 位)。

编辑2:

好的,我刚刚注意到的另一件事是,如果您有12345-12345但不想从中获得任何数字,您可以使用:

preg_match_all("/\b\d{5}(?!-\d{1,3}\b|-\d{5})(?:-\d{4})?\b/", $str, $matches);

负前瞻防止匹配-12345(或更多数字,或少于 4 位数字)(如果存在),但只允许 4 位数字。

正则表达式101演示

于 2013-10-08T05:48:38.233 回答
2

你的模式是

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

在 Regexr 上查看。

这里的一个重要部分是单词边界 \b,它们确保没有匹配数字的一部分。

\d{5}与您已有的 5 位数字匹配

(?:-\d{4})?是可选部分(因为在组? 之后)。组?:开始时只是使不被捕获。

于 2013-10-08T05:54:43.083 回答
0

我最近在javascript中实现了这个

/^(\s*|\d{5}([\-]\d{4})?)$/;
于 2013-10-08T05:59:09.723 回答
0

只需修改您的正则表达式以允许可选前缀:

preg_match_all("/\d{5}(\-\d{4})?/", $str, $matches);
于 2013-10-08T05:44:53.280 回答