Hàm validate số điện thoại Việt Nam chuẩn trong PHP

Số điện thoại là dữ liệu bị người dùng nhập bừa nhiều nhất: dấu cách, dấu chấm, +84 lẫn 0, đầu số cũ – mới lẫn lộn. Nếu backend không xử lý kỹ, database sẽ thành một bãi rác đúng nghĩa. Bài này tập trung vào một mục tiêu duy nhất: validate số điện thoại Việt Nam cho đúng, thực dụng và cập nhật, không đoán mò, không regex nửa mùa.

Hàm validate số điện thoại Việt Nam chuẩn trong PHP

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 0 hoặ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

  1. Chuẩn hóa chuỗi đầu vào
  2. Đưa về một format thống nhất
  3. Kiểm tra đầu số hợp lệ
  4. Đả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


  • Không có bình luận.

Init Toolbox

Nhấn Ctrl + \ trên máy tính, hoặc vuốt sang trái ở bất kỳ đâu trên mobile.

Đăng nhập





Đang tải...