2012-01-02 88 views
15

我需要在PHP地址使用正則表達式匹配:的preg_match PHP的街道地址

  • 144街道,城市,州郵編/郵政編碼
  • 144街,易#1,城市,州郵編/郵政編碼
  • 144街道易於#1,城市狀態拉鍊/郵政編碼

拉鍊/郵政編碼可以包括字母和/或數字。

這裏是我的嘗試:

print_r(preg_match('/^([0-9]+)\s([a-z]+)\s([a-z]+)\s([a-z]+)\s([a-z0-9]+)$/i', $t, $m)); 
print_r($m); 

它輸出:

Array 
(
    [0] => 123 asd asd asd 123 
    [1] => 123 
    [2] => street 
    [3] => city 
    [4] => state 
    [5] => zip 
) 

這僅使用空格。當我有一個逗號時,它不起作用,並導致一個空數組。

我能做些什麼還包括逗號?

+0

它不會在你的'#'裏面工作。除了上面的示例之外,您能否更精確地瞭解您期望的輸入內容? – fge 2012-01-02 12:34:01

回答

15

爲什麼不簡單地刪除逗號然後使用正則表達式?

對於字母數字zip也可能需要添加除a-z0-9之外的其他字符,因爲加拿大郵政編碼使用空格。

,你將需要檢查的另一件事是,如果一條街中有空格,如:

1000 NW單向驅動

OR

100街Des Peupliers

你的正則表達式不起作用。同樣的城市。

使用API​​是好的,但你必須爲你需要的國家獲取API。如果你想驗證所有可能會痛苦的國家。

ceejayoz有一個很好的答案,但我認爲你應該做的是獲得你得到的頂級國家的API,然後使用正則表達式的一切。

-1

[0-9]+\s(\w)*(\W)(\s?)(\w)*(\W)(#[0-9])?(\W*)(\w)*(\W)(\s?)(\w)*(\s?)(\w)*

試試這個

+4

我得到:PHP警告:preg_match():未知的修飾符'+' – Marty 2012-01-02 12:47:32

1
/^([0-9]+)\s([a-z]+)(,\s|\s)([a-z]+)(,\s|\s)([a-z]+)(,\s|\s)([a-z0-9]+)$/i 

只是改變 「\ S」 到 「(中,\ s | \ S)」,這將匹配任何一個空格或逗號和whtiespace。除了上面提到的,你的表情還有很多問題。想想街道或城市名稱的空格或連字符例如...

0

美國郵政服務有一個標準化API - https://www.usps.com/business/webtools.htm

通過正則表達式做這件事將是一個痛苦的,令人毛骨悚然的過程。許多地址不符合通常的格式。

+2

這對美國很好,那麼Canda呢?英國? – aki 2012-01-02 13:13:22

+0

我以爲OP提到的只是US風格的地址,但我看到他指定「zip」可以包含字母,我認爲它使得它比郵政編碼更多。儘管如此,這對他的很多地址都有幫助。 – ceejayoz 2012-01-02 13:14:23

+0

對不起,我在問題 – aki 2012-01-02 14:01:13