邮政信箱验证

时间:2011-03-01 19:48:45

标签: php regex

希望验证PO Box,但想知道是否存在此类验证。我将地址字段拆分为地址1和地址2(这样的PO,Apt,套件信息将去哪里)

示例:

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

PO Box(也可以用于BOX的子BIN)示例:

  • 邮政信箱123
  • P.O。方框123
  • PO 123
  • 邮政信箱123
  • P.O 123
  • Box 123
  • 123

  • 123
  • POB 123
  • P.O.B 123
  • P.O.B。 123
  • Post 123
  • 邮箱123

(我知道我可能需要更多验证,但这是我能想到的,随意添加或更正)

我知道RegEx最适合这个,我在Stack #1上看到了其他问题,#2

使用另一个问题的RegEx我得到了很好的结果,但它错过了一些我认为它应该抓住

$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";
    }
}

为什么它没有捕获数组中的最后两个值?

3 个答案:

答案 0 :(得分:10)

截至目前,你的正则表达式需要'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/是一个非常好的正则表达式测试引擎。总是很高兴知道新工具:)

答案 1 :(得分: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 :(得分: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 +以跳过号码要求。