2011-03-01 47 views
8

Tìm cách xác thực PO Box nhưng muốn biết liệu xác thực đó có tồn tại hay không. Tôi có sự phân chia lĩnh vực Địa chỉ vào Địa chỉ 1 và Địa chỉ 2 (Nơi PO như vậy, Apt, thông tin Suite sẽ đi)Xác thực Hộp thư bưu điện

Ví dụ:

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

PO Box (Can phụ BIN cho BOX cũng) Ví dụ:

  • PO Box 123
  • PO Hộp 123
  • PO 123
  • Bưu Box 123
  • P.O 123
  • Box 123
  • POB 123
  • P.O.B 123
  • P.O.B. 123
  • bài viết 123
  • bài Box 123

(Tôi biết có lẽ tôi càng cần phải xác nhận cho nhưng đây là những gì tôi có thể nghĩ ra, cảm thấy tự do để thêm hoặc đúng)

Tôi biết một RegEx sẽ là tốt nhất cho điều này và tôi đã nhìn thấy các câu hỏi khác trên Stack #1, #2

Sử dụng RegEx từ câu hỏi khác tôi nhận được kết quả tốt nhưng nó nhớ một số tôi nghĩ rằng nó sẽ bắt

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

Tại sao nó không bắt hai giá trị cuối cùng trong mảng?

+0

+1 để thực hiện nghiên cứu tốt trước khi đặt câu hỏi. – srijan

+0

Đối với một câu hỏi JS nhưng vẫn là một câu trả lời tuyệt vời: https://stackoverflow.com/questions/5680050/po-box-regular-expression-validation – turibe

Trả lời

9

Hiện tại với regex của bạn, 'O' trong 'OFFICE' là bắt buộc. Thay vào đó, hãy thử ^\s*((P(OST)?.?\s*(O(FF(ICE)?))?.?\s+(B(IN|OX))?)|B(IN|OX)) (nhóm 'O' trong kết hợp có điều kiện).

CHỈNH SỬA: Thay vào đó phải là /^\s*((P(OST)?.?\s*(O(FF(ICE)?)?)?.?\s+(B(IN|OX))?)|B(IN|OX))/i. BTW, http://rubular.com/ là một công cụ kiểm tra biểu thức chính quy khá tốt. Luôn luôn tốt đẹp để biết các công cụ mới :)

+0

Hmm thêm rằng phá vỡ trận đấu này: P.O. Box 123 –

+0

Cảm ơn bạn đã lưu ý rằng @ phill-pafford, sửa lỗi được thực hiện trong câu trả lời của tôi. Vô tình loại bỏ một trong những dấu hỏi trong regex ban đầu của bạn trong khi thử nghiệm của tôi. – William

+0

Cảm ơn đã làm điều đó –

2

Hãy đi qua nó ...

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

Cái này hoạt động tốt hơn, vì nó loại bỏ các nhóm không cần thiết trong bộ trận đấu và chỉ trả lại toàn bộ trận đấu.

bỏ qua bài 123:

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

Không Bỏ qua bài 123:

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

Tháo \ d + ở cuối để bỏ qua yêu cầu số.

Các vấn đề liên quan