开发者

PO Box Validation

Looking to validate PO Box but wanted to know if such validation existed. I have the Address field split into Address 1 and Address 2 (Where such PO, Apt, Suite info would go)

Example:

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

PO Box (Can sub BIN for BOX as well) Examples:

  • PO Box 123
  • P.O. Box 123
  • PO 123
  • Post Office Box 123
  • P.O 123
  • Box 123
  • 123

  • 123
  • POB 123
  • P.O.B 123
  • P.O.B. 123
  • Post 123
  • Post Box 123

(I know there are probably more I need to validate for but this is what I could think of, feel free to add or correct)

I know a RegEx would be best for this and I've seen the other questions on Stack #1, #2

Using the RegEx from the other question I get good results but it misses some I think it should catch

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

Why is it not catching the last two values in the array?


As of now with your regex, the 'O' in 'OFFICE' is required. Try ^\s*((P(OST)?.?\s*(O(FF(ICE)?))?.?\s+(B(IN|OX))?)|B(IN|OX)) instead (grouping the 'O' in a conditional match).

EDIT: That should be /^\s*((P(OST)?.?\s*(O(FF(ICE)?)?)?.?\s+(B(IN|OX))?)|B(IN|OX))/i instead. BTW, http://rubular.com/ is a pretty good regular expression testing engine. Always nice to know of new tools :)


Let's go through it...

/         # 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.


This one works better, as it removes the unneeded groups in the match set and just returns the whole match.

Skips Post 123:

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

Doesn't Skip Post 123:

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

Remove the \d+ at the end to skip the number requirement.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜