2012-04-26 40 views
1

嗨我想匹配一個搜索字符串,以便如果有我們的郵編是在字符串的開頭,返回郵政編碼以及其餘的字符串。這是我到目前爲止正則表達式noob需要一個模式來匹配特定的字符串模式

$str = "90210 Beverly Hills, CA"; 
$res = preg_match('/^((\d{5})(-\d{4})?)\s+(.+?)$/', $str, $matches); 

但是,當我print_r匹配它返回一個額外的關鍵空間。

Array 
(
    [0] => 90210 Beverly Hills, CA 
    [1] => 90210 
    [2] => 90210 
    [3] => 
    [4] => Beverly Hills, CA 
) 

是否有反正我可以改善模式並返回不是空字符串的匹配?這個實例有更好的模式嗎?此外,如果只給出一個郵政編碼或只是一個文本字符串,它將返回false。

回答

0

答案是。對圖案圓括號的視覺檢查表明第四個匹配是-1234(四個額外的拉鍊數字 - 不知道它們被正式稱爲什麼),並且在您的示例中,它是空的。從你的問題來看,你想要實際捕獲的東西有點不清楚。我將與構造離開可能對您有用:

(?: ...) 

如果一個括號後有?:,表明捕捉不應該做。您可以在「破折號 - 四位數」子模式之前添加它,它不會被添加到matches

+0

嗯,我正在尋找一種模式,所以如果在字符串的開始處有一個郵政編碼並且其後面是文本,則將郵政編碼和文本作爲匹配返回。如果它不符合這些條件(例如,只是「90210」或只是「比佛利山莊,加利福尼亞州」或「貝弗利山莊,加利福尼亞州90210」)它將返回沒有匹配 – kwakhed 2012-04-26 04:57:31

+0

哦..你的原始表達看起來很好,只需使用' 0]',這是整個比賽。如果你不想捕獲一個子模式,使用'?:',但是沒有什麼區別,因爲第0次匹配應該總是你想要的(好吧'':'會更快,但是很少,所以你贏了沒有通知,除非你正在檢查數以百萬計的郵政編碼) – 2012-04-26 05:07:48

+0

非常感謝你! – kwakhed 2012-04-26 05:13:31

0

你的比賽第3組是不是一個空間。它是空的(或者也許沒有定義或者什麼 - 我沒有深入參與PHP)。空值表示與可選組(-\d{4})(美國郵政編碼+4)不匹配。我想你會希望保持你的表情,這樣你就可以輕鬆檢測出沒有ZIP + 4的情況。

相關問題