邮政信箱验证

Phi*_*ord 8 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
Run Code Online (Sandbox Code Playgroud)

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

  • 邮政信箱123
  • 邮政信箱123
  • PO 123
  • 邮政信箱123
  • PO 123
  • 方框123
  • 123

  • 123
  • POB 123
  • POB 123
  • POB 123
  • 发布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";
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Wil*_*iam 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.顺便说一句,http: //rubular.com/ 是一个非常好的正则表达式测试引擎.总是很高兴知道新工具:)