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.
精彩评论