Categories PHP-MySQL

Kiểm tra họ tên hợp chuẩn nhanh hơn với RegEx

Tôi có viết bài về việc xử lý họ tên bằng PHP trước đây, dù các đoạn mã đó cũng thú vị thì với RegEx vấn đề phát hiện lỗi được xử lý nhanh hơn đáng kể.

Tuy nhiên chúng ta cần lưu ý là cú pháp của RegEx chưa tính đến các ngôn ngữ quốc tế, nên cú pháp viết gọn [a-z] để đại diện cho các ký tự từ a đến z không có cái tương ứng trong tiếng Việt (ư, á, ô, ờ, v.v..). Do vậy chúng ta cần bổ sung thủ công vào.

Code mẫu sẽ thế này:

[a-vxyỳọáầảấờễàạằệếýộậốũứĩõúữịỗìềểẩớặòùồợãụủíỹắẫựỉỏừỷởóéửỵẳẹèẽổẵẻỡơôưăêâđ]

Một số lưu ý để kiểm tra chính xác với mã trên:

Nếu không làm 2 việc trên bạn sẽ cần phải bổ sung thêm 3 dãy ký tự nữa gồm:

  • Dạng viết hoa mã hóa phổ thông của ký tự tiếng Việt có dấu;
  • Dạng viết thường mã hóa ít dùng của ký tự tiếng Việt có dấu;
  • Dạng viết hoa mã hóa ít dùng của ký tự tiếng Việt có dấu;

Đoạn mã trên tối ưu cho việc kiểm tra họ tên của người Kinh, với họ tên của người dân tộc, hoặc con lai Việt Nam với người nước ngoài, bạn nên bổ sung thêm 3 ký tự nữa là z, w và ‘

Trong trường hợp như vậy, thì đoạn mã trên có thể chỉnh lại là:



[a-zỳọáầảấờễàạằệếýộậốũứĩõúữịỗìềểẩớặòùồợãụủíỹắẫựỉỏừỷởóéửỵẳẹèẽổẵẻỡơôưăêâđ']

Các ký tự không phải là chữ cái như số (1 đến 9), các ký tự đặc biệt như !, @, #, *,… sẽ được phát hiện và báo lỗi.

Với các ký tự không dấu lệnh regex để bắt họ tên là:

^([a-z]+)((\s{1}[a-z]+){1,})$

Câu lệnh trên yêu cầu:

  • Chỉ có chữ cái từ a đến z và khoảng trống được phép có trong tên;
  • Ký tự đầu và cuối phải là chữ cái;
  • Họ tên phải bao gồm ít nhất 2 từ (chữ) trở lên;
  • Giữa các từ chỉ có một dấu cách;

Câu lệnh tương tự cho tiếng Việt sẽ là:

^([a-vxyỳọáầảấờễàạằệếýộậốũứĩõúữịỗìềểẩớặòùồợãụủíỹắẫựỉỏừỷởóéửỵẳẹèẽổẵẻỡơôưăêâđ]+)((\s{1}[a-vxyỳọáầảấờễàạằệếýộậốũứĩõúữịỗìềểẩớặòùồợãụủíỹắẫựỉỏừỷởóéửỵẳẹèẽổẵẻỡơôưăêâđ]+){1,})$

Nếu bạn muốn giới hạn số ký tự trong một từ chỉ là 10 và số từ trong một tên tối đa là 5 thì viết như sau:

^([a-z]{1,10})((\s{1}[a-z]{1,10}){1,4})$
Back to Top