Tôi thấy câu hỏi này rất nhiều khi tôi làm việc cho một công ty xác minh địa chỉ. Tôi đang đăng câu trả lời ở đây để làm cho nó dễ tiếp cận hơn với các lập trình viên đang tìm kiếm xung quanh với cùng một câu hỏi. Công ty tôi đã xử lý hàng tỷ địa chỉ và chúng tôi đã học được rất nhiều trong quá trình này.
Đầu tiên, chúng ta cần hiểu một vài điều về địa chỉ.
Điều này có nghĩa là các biểu thức thông thường được đưa ra. Tôi đã thấy tất cả, từ các biểu thức chính quy đơn giản khớp địa chỉ theo một định dạng rất cụ thể, đến đây:
/ \ s + (\ d {2,5} \ s +) (?! [a | p] m \ b) (([a-zA-Z | \ s +] {1,5}) {1,2}) ? ([\ s |, |.] +)? (([a-zA-Z | \ s +] {1,30}) {1,4}) (tòa án | ct | đường phố | st | drive | dr | làn đường | ln | đường | đường | blvd) ([\ s |, |. |;] +)? (([a-zA-Z | \ s +] {1,30}) {1,2}) ([ \ s |, |.] +)? \ b (AK | AL | AR | AZ | CA | CO | CT | DC | DE | FL | GA | GU | HI | IA | ID | IL | IN | KS | KY | | LA | MA | MD | ME | MI | MN | MO | MS | MT | NC | ND | NE | NH | NJ | NM | NV | NY | OH | OK | OR | PA | RI | SC | SD | TN | TX | UT | VA | VI | VT | WA | WI | WV | WY) ([\ s |, |.] +)? (\ S + \ d {5})? ([\ S |, |.] +) / tôi
... đến đây , nơi một tệp hơn 900 dòng tạo ra một biểu thức chính quy siêu lớn khi đang di chuyển để phù hợp hơn nữa. Tôi không đề xuất những điều này (ví dụ, đây là một câu đố về regex ở trên, điều đó gây ra nhiều sai lầm ). Không có một công thức ma thuật dễ dàng nào để làm việc này. Về lý thuyết và theo lý thuyết, không thể kết hợp các địa chỉ với một biểu thức chính quy.
Ấn phẩm USPS 28 ghi lại nhiều định dạng của các địa chỉ có thể, với tất cả các từ khóa và variatons của chúng. Tệ nhất của tất cả, địa chỉ thường mơ hồ. Các từ có thể có nghĩa nhiều hơn một thứ ("St" có thể là "Saint" hoặc "Street") và có những từ mà tôi khá chắc chắn rằng chúng đã phát minh ra. (Ai biết rằng "Stravenue" là hậu tố đường phố?)
Bạn sẽ cần một số mã thực sự hiểu địa chỉ và nếu mã đó tồn tại, đó là một bí mật thương mại. Nhưng bạn có thể có thể tự lăn nếu bạn thực sự thích điều đó.
Địa chỉ có hình dạng và kích thước bất ngờ
Dưới đây là một số địa chỉ (nhưng đầy đủ):
1) 102 main street
Anytown, state
2) 400n 600e #2, 52173
3) p.o. #104 60203
Ngay cả những điều này có thể hợp lệ:
4) 829 LKSDFJlkjsdflkjsdljf Bkpw 12345
5) 205 1105 14 90210
Rõ ràng, những điều này không được tiêu chuẩn hóa. Dấu câu và ngắt dòng không được đảm bảo. Đây là những gì đang xảy ra:
Số 1 hoàn thành vì nó chứa địa chỉ đường phố và thành phố và tiểu bang. Với thông tin đó, có đủ xác định địa chỉ và nó có thể được coi là "có thể giao được" (với một số tiêu chuẩn hóa).
Số 2 hoàn tất vì nó cũng chứa một địa chỉ đường phố (với số thứ cấp / đơn vị) và mã ZIP gồm 5 chữ số, đủ để xác định một địa chỉ.
Số 3 là một định dạng hộp thư bưu điện hoàn chỉnh, vì nó chứa mã ZIP.
Số 4 cũng hoàn thành vì mã ZIP là duy nhất , có nghĩa là một thực thể tư nhân hoặc công ty đã mua không gian địa chỉ đó. Mã ZIP duy nhất dành cho không gian phân phối có khối lượng lớn hoặc tập trung. Bất cứ điều gì được gửi đến mã ZIP 12345 đều đến General Electric ở Schenectady, NY. Ví dụ này sẽ không đến được với bất kỳ ai, nhưng USPS vẫn có thể cung cấp nó.
Số 5 cũng đã hoàn thành, tin hay không. Chỉ với những con số đó, địa chỉ đầy đủ có thể được phát hiện khi phân tích cú pháp dựa trên cơ sở dữ liệu của tất cả các địa chỉ có thể. Điền vào các hướng bị thiếu, chỉ định phụ và mã ZIP + 4 là không đáng kể khi bạn xem mỗi số là một thành phần. Đây là những gì nó trông giống như, hoàn toàn mở rộng và tiêu chuẩn hóa:
205 N 1105 W Apt 14
Đồi tuyết CA 90210-5221
Dữ liệu địa chỉ không phải của riêng bạn
Ở hầu hết các quốc gia cung cấp dữ liệu địa chỉ chính thức cho các nhà cung cấp được cấp phép, dữ liệu địa chỉ thuộc về cơ quan chủ quản. Ở Mỹ, USPS sở hữu các địa chỉ. Điều tương tự cũng đúng với Canada Post, Royal Mail và các quốc gia khác, mặc dù mỗi quốc gia thực thi hoặc định nghĩa quyền sở hữu khác nhau một chút. Biết điều này rất quan trọng, vì nó thường cấm kỹ thuật đảo ngược cơ sở dữ liệu địa chỉ. Bạn phải cẩn thận làm thế nào để có được, lưu trữ và sử dụng dữ liệu.
Google Maps là một cách phổ biến để sửa lỗi địa chỉ nhanh chóng, nhưng ĐKDV khá nghiêm cấm; ví dụ: bạn không thể sử dụng dữ liệu hoặc API của họ mà không hiển thị Google Map và chỉ cho các mục đích phi thương mại (trừ khi bạn trả tiền) và bạn không thể lưu trữ dữ liệu (ngoại trừ bộ nhớ đệm tạm thời). Có ý nghĩa. Dữ liệu của Google là một số tốt nhất trên thế giới. Tuy nhiên, Google Maps không xác minh địa chỉ. Nếu một địa chỉ không tồn tại, nó vẫn sẽ cho bạn thấy nơi địa chỉ sẽ được nếu nó đã tồn tại (thử nó trên đường phố của riêng bạn, sử dụng một số nhà mà bạn biết không tồn tại). Điều này đôi khi hữu ích, nhưng hãy lưu ý về điều đó.
Chính sách sử dụng của Nominatim cũng hạn chế tương tự, đặc biệt là sử dụng với số lượng lớn và thương mại và dữ liệu chủ yếu được lấy từ các nguồn miễn phí, do đó, nó không được duy trì tốt (như bản chất của các dự án mở) - tuy nhiên, điều này vẫn có thể phù hợp bạn cần. Nó được hỗ trợ bởi một cộng đồng lớn.
Bản thân USPS có API, nhưng nó đi xuống rất nhiều và không có sự đảm bảo cũng như không hỗ trợ. Nó cũng có thể khó sử dụng. Một số người sử dụng nó một cách tiết kiệm mà không có vấn đề. Nhưng thật dễ để bỏ lỡ rằng USPS yêu cầu bạn chỉ sử dụng API của họ để xác nhận địa chỉ để gửi qua chúng.
Mọi người mong đợi địa chỉ sẽ khó khăn
Thật không may, chúng tôi đã tạo điều kiện cho xã hội của chúng tôi hy vọng địa chỉ sẽ phức tạp. Có hàng tá bài viết về UX hay trên Internet về vấn đề này, nhưng thực tế là, nếu bạn có một mẫu địa chỉ với các trường riêng lẻ, đó là những gì người dùng mong đợi, mặc dù điều đó làm cho các địa chỉ trường hợp cạnh không phù hợp với định dạng biểu mẫu đang mong đợi hoặc có thể biểu mẫu yêu cầu trường không nên. Hoặc người dùng không biết nơi để đặt một phần nhất định trong địa chỉ của họ.
Tôi có thể tiếp tục về các hình thức thanh toán UX tồi tệ hiện nay, nhưng thay vào đó tôi sẽ chỉ nói rằng việc kết hợp các địa chỉ vào một trường sẽ là một thay đổi đáng hoan nghênh - mọi người sẽ có thể nhập địa chỉ của họ theo cách họ thấy phù hợp , thay vì cố gắng tìm ra hình thức dài của bạn. Tuy nhiên, thay đổi này sẽ bất ngờ và người dùng có thể thấy nó hơi chói tai lúc đầu. Chỉ cần nhận thức được điều đó.
Một phần của nỗi đau này có thể được giảm bớt bằng cách đưa lĩnh vực quốc gia ra phía trước, trước địa chỉ. Khi họ điền vào trường quốc gia đầu tiên, bạn biết cách làm cho biểu mẫu của bạn xuất hiện. Có thể bạn có một cách tốt để xử lý các địa chỉ một trường ở Hoa Kỳ, vì vậy nếu họ chọn Hoa Kỳ, bạn có thể giảm biểu mẫu của mình thành một trường duy nhất, nếu không thì hiển thị các trường thành phần. Chỉ là những điều cần suy nghĩ!
Bây giờ chúng tôi biết tại sao nó khó; Bạn có thể làm gì về nó?
USPS cấp phép cho các nhà cung cấp thông qua quy trình gọi là Chứng nhận CASS ™ để cung cấp địa chỉ được xác minh cho khách hàng. Các nhà cung cấp này có quyền truy cập vào cơ sở dữ liệu USPS, được cập nhật hàng tháng. Phần mềm của họ phải tuân thủ các tiêu chuẩn khắt khe để được chứng nhận và họ thường không yêu cầu phải đồng ý với các điều khoản giới hạn như đã thảo luận ở trên.
Có nhiều công ty được chứng nhận CASS có thể xử lý danh sách hoặc có API: Dữ liệu Melissa, QAS Experian và SmartyStreets để đặt tên cho một số.
(Do nhận được thông báo "quảng cáo", tôi đã cắt câu trả lời của mình vào thời điểm này. Tùy thuộc vào bạn để tìm giải pháp phù hợp với bạn.)
Sự thật: Thực sự, mọi người, tôi không làm việc tại bất kỳ công ty nào trong số này. Đây không phải là một quảng cáo.