在PHP中,如何確定一個字符串中是否存在郵政編碼,如果是,則返回郵政編碼。在這種情況下,郵政編碼可以是5個數字的字符串(即「55543」)或5個數字的字符串連接到另外4個帶有連字符的數字(即「74657-9993」)。返回字符串中的數字
Can任何人都可以使用preg_match
或其他任何一種好的方法來幫助我解決這個問題。
我有preg_match_all("/\d{5}/", $str, $matches);
到目前爲止,但是這並沒有考慮到可能的第二個4位數或連字符。
在PHP中,如何確定一個字符串中是否存在郵政編碼,如果是,則返回郵政編碼。在這種情況下,郵政編碼可以是5個數字的字符串(即「55543」)或5個數字的字符串連接到另外4個帶有連字符的數字(即「74657-9993」)。返回字符串中的數字
Can任何人都可以使用preg_match
或其他任何一種好的方法來幫助我解決這個問題。
我有preg_match_all("/\d{5}/", $str, $matches);
到目前爲止,但是這並沒有考慮到可能的第二個4位數或連字符。
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位數字。
只需修改您的正則表達式來允許可選的前綴:
preg_match_all("/\d{5}(\-\d{4})?/", $str, $matches);
你的模式是
\b\d{5}(?:-\d{4})?\b
看到它here on Regexr。
這裏的一個重要部分是word boundaries\b
,他們確保不是數字的一部分匹配。
\d{5}
是匹配5位數字,你已經有了它
(?:-\d{4})?
是可選部分(因爲的組後?
的)。該組開始時的?:
只是使group未捕獲。
我在JavaScript中
/^(\s*|\d{5}([\-]\d{4})?)$/;
這似乎是最好的工作,到目前爲止所有的答案最近實施此,感謝 –
我不知道,但將這項工作的'123456'呢? – zzlalani
那麼'12345-12345'也可以工作嗎? – zzlalani