2011-03-01 15 views
8

Buscando validar PO Box, pero quería saber si existía tal validación. Tengo la división campo Dirección en Dirección 1 y Dirección 2 (Cuando esta PO, Apt, información suite iría)Validación de casilla postal

Ejemplo:

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

PO Box (Can sub BIN de caja también) Ejemplos:

  • PO Box 123
  • PO Box 123
  • PO Box 123
  • oficina de correos 123
  • P.O 123
  • Box 123
  • POB 123
  • P.O.B 123
  • casilla de correos 123
  • Mensaje 123
  • Post Box 123

(Sé que hay probablemente más que necesitan validar para pero esto es lo que podía pensar, no dude en añadir o corregir)

sé que una expresión regular sería mejor para esto y he visto las otras preguntas en Pila #1, #2

Uso de la expresión regular de la otra pregunta que me hacen buenos resultados, pero se echa de menos alguna creo que debería ponerse

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

¿Por qué no está capturando los dos últimos valores en la matriz?

+0

+1 por hacer una buena investigación antes de hacer una pregunta. – srijan

+0

Para una pregunta JS pero sigue siendo una respuesta excelente: https://stackoverflow.com/questions/5680050/po-box-regular-expression-validation – turibe

Respuesta

9

A partir de ahora con su expresión regular, se requiere la 'O' en 'OFICINA'. Pruebe ^\s*((P(OST)?.?\s*(O(FF(ICE)?))?.?\s+(B(IN|OX))?)|B(IN|OX)) en su lugar (agrupando la 'O' en una coincidencia condicional).

EDITAR: Eso debería ser /^\s*((P(OST)?.?\s*(O(FF(ICE)?)?)?.?\s+(B(IN|OX))?)|B(IN|OX))/i en su lugar. Por cierto, http://rubular.com/ es un buen motor de prueba de expresión regular. Siempre es bueno saber de nuevas herramientas :)

+0

Hmm agregando que rompe esta coincidencia: P.O. Box 123 –

+0

Gracias por señalar que @ phill-pafford, corrección hecha en mi respuesta. Accidentalmente eliminó uno de los signos de interrogación en su expresión regular original mientras probaba el mío. – William

+0

Gracias que lo hizo –

2

Vamos a ir a través de él ...

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

Esta funciona mejor, ya que elimina los grupos que no sean necesarios en el conjunto de partido y sólo devuelve todo el partido.

Salta Mensaje 123:

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

¿No Pasar Mensaje 123:

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

Quitar el \ d + al final saltarse el requisito de número.

Cuestiones relacionadas