Проверка почтового ящика - PullRequest
8 голосов
/ 01 марта 2011

Глядя на проверку почтового ящика, но хотел знать, существует ли такая проверка. У меня есть поле адреса, разделенное на адрес 1 и адрес 2 (куда пойдет информация о PO, Apt, Suite)

Пример:

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

Почтовый ящик (может также сабвуфер для коробки) Примеры:

  • PO Box 123
  • P.O. Коробка 123
  • PO 123
  • Почтовый ящик 123
  • P.O 123
  • Коробка 123
  • 123

  • 123
  • POB 123
  • P.O.B 123
  • P.O.B. 123
  • Пост 123
  • Почтовый ящик 123

(я знаю, что, возможно, мне нужно еще кое-что проверить, но я могу об этом подумать, не стесняйтесь добавлять или исправлять)

Я знаю, что для этого лучше всего подойдет RegEx, и я видел другие вопросы по стеку # 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 ]

10 голосов
/ 01 марта 2011

На данный момент с вашим регулярным выражением требуется «O» в «OFFICE». Вместо этого попробуйте ^\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/ - довольно неплохой механизм тестирования регулярных выражений. Всегда приятно узнать о новых инструментах:)

2 голосов
/ 29 августа 2012

Это работает лучше, так как удаляет ненужные группы из набора совпадений и просто возвращает все совпадение.

Пропускает сообщение 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 + в конце, чтобы пропустить требование числа.

2 голосов
/ 01 марта 2011

Давайте пройдем через это ...

/         # 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...