2013-10-08 84 views
0

在PHP中,如何確定一個字符串中是否存在郵政編碼,如果是,則返回郵政編碼。在這種情況下,郵政編碼可以是5個數字的字符串(即「55543」)或5個數字的字符串連接到另外4個帶有連字符的數字(即「74657-9993」)。返回字符串中的數字

Can任何人都可以使用preg_match或其他任何一種好的方法來幫助我解決這個問題。

我有preg_match_all("/\d{5}/", $str, $matches);到目前爲止,但是這並沒有考慮到可能的第二個4位數或連字符。

回答

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

+0

這似乎是最好的工作,到目前爲止所有的答案最近實施此,感謝 –

+0

我不知道,但將這項工作的'123456'呢? – zzlalani

+0

那麼'12345-12345'也可以工作嗎? – zzlalani

0

只需修改您的正則表達式來允許可選的前綴:

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

你的模式是

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

看到它here on Regexr

這裏的一個重要部分是word boundaries\b,他們確保不是數字的一部分匹配。

\d{5}是匹配5位數字,你已經有了它

(?:-\d{4})?是可選部分(因爲的組後?的)。該組開始時的?:只是使group未捕獲。

0

我在JavaScript中

/^(\s*|\d{5}([\-]\d{4})?)$/;