2011-03-01 131 views
8

希望驗證郵政信箱,但想知道是否存在此類驗證。我有地址字段分成地址1和地址2(如PO,公寓,套房信息會去)郵政信箱驗證

例子:

Address 1: 123 Main Street 
Address 2: Suite 100 
City: Any Town  
State: Any State 
Zip: Any Zip 

郵政信箱(能分BIN爲BOX以及)的例子:

  • 郵政信箱123
  • PO框123
  • PO 123
  • 郵政信箱123
  • P.O 123
  • 箱123
  • POB 123
  • P.O.B 123
  • P.O.B. 123
  • 後123
  • 郵政信箱123

(我知道有可能更多,我需要驗證的,但是這是我能想到的,隨時補充或更正)

我知道一個正則表達式將是最適合這一點,我已經看到了堆棧#1的其他問題,#2

從另一個問題使用正則表達式,我得到了良好的效果,但它忽略了一些我認爲應該趕上

$arr = array (
    'PO Box 123', 
    'P.O. Box 123', 
    'PO 123', 
    'Post Office Box 123', 
    'P.O 123', 
    'Box 123', 
    '#123',   // no match 
    '123',   // no match 
    'POB 123', 
    'P.O.B 123', // no match 
    'P.O.B. 123', // no match 
    'Post 123',  // no match 
    'Post Box 123' // no match 
); 

foreach($arr as $po) { 
    if(preg_match("/^\s*((P(OST)?.?\s*O(FF(ICE)?)?.?\s+(B(IN|OX))?)|B(IN|OX))/i", $po)) { 
     echo "A match was found: $po\n"; 
    } else { 
     echo "A match was not found: |$po| \n"; 
    } 
} 

爲什麼它不捕獲數組中的最後兩個值?

+0

+1在提問前做好研究。 – srijan 2012-10-01 14:40:10

+0

對於一個JS問題,但仍然是一個很好的答案:https://stackoverflow.com/questions/5680050/po-box-regular-expression-validation – turibe 2017-09-22 21:25:35

回答

9

截至現在您的正則表達式中,'OFFICE'中的'O'是必需的。改爲嘗試^\s*((P(OST)?.?\s*(O(FF(ICE)?))?.?\s+(B(IN|OX))?)|B(IN|OX))(在條件匹配中將'O'分組)。

編輯:這應該是/^\s*((P(OST)?.?\s*(O(FF(ICE)?)?)?.?\s+(B(IN|OX))?)|B(IN|OX))/i而不是。順便說一句,http://rubular.com/是一個很不錯的正則表達式測試引擎。總是很高興知道新的工具:)

+0

嗯添加,打破這場比賽:P.O. Box 123 – 2011-03-01 19:57:48

+0

感謝您注意@ phill-pafford,在我的回答中進行了更正。在測試我的同時,意外刪除了原始正則表達式中的其中一個問號。 – William 2011-03-01 20:01:30

+0

謝謝你做了 – 2011-03-01 20:02:50

2

讓我們通過它...

/   # Beginning of the regex 
^   # Beginning of the string 
\s*  # (Any whitespace) 
((
    P  # Matches your P 
    (OST)? # Matches your ost 
    .?  # Matches the space 
    \s*  # (Any whitespace) 
    O  # Expects an O - you don't have one. Regex failed. 
2

這一個效果更好,因爲它消除在比賽中集集團不需要的,只是返回了全場比賽。

跳過後123:

/^\s*((?:P(?:OST)?.?\s*(?:O(?:FF(?:ICE)?)?)?.?\s*(?:B(?:IN|OX)?)+)+|(?:B(?:IN|OX)+\s+)+)\s*\d+/i 

不會跳過後123:

/^\s*((?:P(?:OST)?.?\s*(?:O(?:FF(?:ICE)?)?)?.?\s*(?:B(?:IN|OX)?)?)+|(?:B(?:IN|OX)+\s+)+)\s*\d+/i 

在末尾刪除\ d +跳過數的要求。