2011-03-01 133 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 +跳过数的要求。