Những sai lầm phổ biến khi validate số điện thoại
- Chỉ kiểm tra độ dài 10 hoặc 11 số
- Dùng regex quá đơn giản
- Không chuẩn hóa +84 và 0
- Không cập nhật đầu số mới
Kết quả: số rác vẫn lọt, số thật thì bị loại. Cả hai đều dở.
Định dạng số điện thoại việt nam hiện nay
Một số điện thoại di động Việt Nam hợp lệ có đặc điểm:
- Bắt đầu bằng
0hoặc+84 - Sau khi chuẩn hóa: 10 chữ số
- Đầu số thuộc nhà mạng hợp lệ
Ví dụ hợp lệ:
- 0912345678
- +84912345678
- 0912 345 678
Chiến lược xử lý đúng
- Chuẩn hóa chuỗi đầu vào
- Đưa về một format thống nhất
- Kiểm tra đầu số hợp lệ
- Đảm bảo chỉ chứa chữ số
Hàm validate số điện thoại việt nam
<?php
function validate_vietnam_phone(string $phone): bool
{
// 1. loại bỏ khoảng trắng, dấu chấm, dấu gạch
$phone = trim($phone);
$phone = preg_replace('/[\s\.\-]/', '', $phone);
// 2. chuẩn hóa +84 về 0
if (str_starts_with($phone, '+84')) {
$phone = '0' . substr($phone, 3);
}
// 3. chỉ cho phép chữ số
if (!ctype_digit($phone)) {
return false;
}
// 4. độ dài chuẩn
if (strlen($phone) !== 10) {
return false;
}
// 5. danh sách đầu số di động việt nam (cập nhật)
$validPrefixes = [
'032','033','034','035','036','037','038','039', // Viettel
'070','076','077','078','079', // MobiFone
'081','082','083','084','085','088', // VinaPhone
'056','058', // Vietnamobile
'059' // Gmobile
];
$prefix = substr($phone, 0, 3);
return in_array($prefix, $validPrefixes, true);
}
Vì sao không dùng regex một phát cho xong
Regex có thể gộp tất cả vào một dòng, nhưng:
- Khó đọc
- Khó bảo trì
- Đầu số đổi là sửa mệt nghỉ
Tách từng bước như trên giúp:
- Dễ debug
- Dễ mở rộng
- Không cần đọc regex mà đoán ý đồ tác giả
Ví dụ sử dụng thực tế
<?php
$phone = $_POST['phone'] ?? '';
if (!validate_vietnam_phone($phone)) {
die('Số điện thoại không hợp lệ');
}
// an tâm lưu database
Nên lưu số điện thoại theo format nào
Khuyến nghị:
- Lưu dạng 0xxxxxxxxx
- Hoặc chuẩn E.164: +84xxxxxxxxx (nếu làm hệ thống lớn)
Quan trọng nhất: chỉ lưu một format duy nhất. Đừng để mỗi bản ghi một kiểu.
Kết luận
Validate số điện thoại không khó, cái khó là làm cho đúng và bền. Một hàm rõ ràng, từng bước, cập nhật đầu số đầy đủ sẽ giúp backend sạch dữ liệu, frontend đỡ chửi, và bạn đỡ phải viết script dọn rác sau này.
Nhập bừa là bản năng người dùng, xử lý gọn là trách nhiệm của backend!
Bình luận