2011-03-01 8 views
8

PO Boxを検証するが、そのような検証が存在するかどうかを知りたい。 Iアドレス1にアドレスフィールド分割を持っており、2アドレス(例えばPOを、アプト、スイート情報が行くだろう)PO Box Validation

例:

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

私書箱(CANサブ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"; 
    } 
} 

なぜ、配列の最後の2つの値がキャッチされないのですか?

+0

+1質問をする前に良い研究をしています。 – srijan

+0

JSの質問については、まだ優れた答えです:https://stackoverflow.com/questions/5680050/po-box-regular-expression-validation – turibe

答えて

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である必要があります。 BTW、http://rubular.com/はかなり良い正規表現テストエンジンです。新しいツールの知っていることは常に素敵な:)

+0

このマッチを破る: Box 123 –

+0

@ phill-paffordに気づいてくれてありがとう、私の答えで修正。誤って私のテスト中に元の正規表現の疑問符の1つを削除しました。 – William

+0

ありがとうございました –

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

それはマッチセットで不要なグループを削除し、ちょうどマッチ全体を返すようこの1つは、良い作品。

スキップポストは123:数の要件をスキップするように末尾に\ d個の+を削除

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

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

は、ポスト123をスキップしません。