2011-03-01 11 views
8

Próbuję zweryfikować skrytkę pocztową, ale chciałem się dowiedzieć, czy takie zatwierdzenie istniało. Mam rozłam polu adresowym do Adres 1 i adres 2 (gdzie takie PO, Apt, info Suite pójdzie)Sprawdzenie ważności skrytki pocztowej

Przykład:

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

Box (Może sub BIN dla BOX również) Przykłady:

  • Box 123
  • PO Box 123
  • PO 123
  • skrzynki Post Office 123
  • doustnie 123
  • Box 123
  • POB 123
  • P.O.B 123
  • P.O.B. 123
  • post 123
  • Post Box 123

(wiem, że są prawdopodobnie bardziej muszę potwierdzić na ale to co mogę myśleć, nie krępuj się, aby dodać lub prawidłowe)

wiem regex byłby najlepszy do tego i widziałem inne pytania na stosie #1, #2

Korzystanie regex z drugiej pytanie mam dobre wyniki, ale strzela niektóre myślę, że powinno złapać

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

Dlaczego nie przechwytuje dwóch ostatnich wartości w tablicy?

+0

+1 za wykonanie dobrych badań przed zadaniem pytania. – srijan

+0

Dla pytania dotyczącego JS, ale wciąż jest to doskonała odpowiedź: https://stackoverflow.com/questions/5680050/po-box-regular-expression-validation – turibe

Odpowiedz

9

Na razie w przypadku wyrażenia regularnego wymagane jest "O" w "BIURA". Zamiast tego spróbuj ^\s*((P(OST)?.?\s*(O(FF(ICE)?))?.?\s+(B(IN|OX))?)|B(IN|OX)) (zgrupowanie "O" w dopasowaniu warunkowym).

EDYCJA: To powinno być /^\s*((P(OST)?.?\s*(O(FF(ICE)?)?)?.?\s+(B(IN|OX))?)|B(IN|OX))/i zamiast tego. BTW, http://rubular.com/ to całkiem niezły silnik testowy. Zawsze miło wiedzieć, nowych narzędzi :)

+0

Hmm dodanie, które łamie ten mecz: P.O. Box 123 –

+0

Dziękuję za uwagę, że @ phill-pafford, korekta dokonana w mojej odpowiedzi. Przypadkowo usunięto jeden ze znaków zapytania w oryginalnym wyrażeniu regularnym podczas testowania mojego. – William

+0

Dzięki, że to zrobiłem –

2

Chodźmy za nim ...

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

Ten działa lepiej, ponieważ usuwa niepotrzebne grupy w zestawie meczu i po prostu zwraca cały mecz.

Przejście post 123:

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

nie pomija Posta 123:

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

Usunąć \ d + na końcu pominąć wymóg numeryczny.

Powiązane problemy