Một cách dễ dàng để định dạng số điện thoại trong PHP là gọi hàm substr() để tách các số của bạn như thế này
<?php $phone_no = "+1735550162"; // 👇 format phone number $format_phone = substr($phone_no, -10, -7) . "-" . substr($phone_no, -7, -4) . "-" . substr($phone_no, -4); print $format_phone; // 173-555-0162
Như bạn có thể thấy, số +1735550162 được định dạng là 173-555-0162
Nhưng hãy nhớ rằng hàm substr() không thể xử lý các số điện thoại ở các định dạng khác nhau
Ví dụ: nếu bạn có các số ở định dạng quốc gia Hoa Kỳ như (111) 234 6789 thì đầu ra sẽ sai
Để xử lý các định dạng số điện thoại khác nhau, bạn cần sử dụng biểu thức chính quy và hàm preg_replace()
Định dạng số điện thoại bằng regex
Đây là một ví dụ để định dạng số điện thoại của Hoa Kỳ bằng regex
function format_phone(string $phone_no) { return preg_replace( "/.*(\d{3})[^\d]{0,7}(\d{3})[^\d]{0,7}(\d{4})/", '($1) $2-$3', $phone_no ); } print format_phone("+1-555-549-4137"); // (555) 549-4137 print PHP_EOL; print format_phone("(555) 096 7286"); // (555) 096-7286
Xin lưu ý rằng giải pháp trên chỉ hoạt động đối với các số điện thoại ở Hoa Kỳ
Số điện thoại từ các quốc gia khác có thể phá vỡ định dạng được tạo bằng biểu thức chính quy ở trên
Định dạng số điện thoại rất khó vì các định dạng và độ dài khác nhau
Nếu bạn muốn có một giải pháp định dạng số điện thoại hoàn chỉnh trong PHP, bạn cần viết rất nhiều mã cho tất cả các định dạng và độ dài có thể
Tôi khuyên bạn nên sử dụng thư viện function format_phone(string $phone_no) { return preg_replace( "/.*(\d{3})[^\d]{0,7}(\d{3})[^\d]{0,7}(\d{4})/", '($1) $2-$3', $phone_no ); } print format_phone("+1-555-549-4137"); // (555) 549-4137 print PHP_EOL; print format_phone("(555) 096 7286"); // (555) 096-7286 0 để thay thế
Định dạng số điện thoại bằng libphonenumber
PHP libphonenumber là triển khai libphonenumber của Google, một thư viện được tạo để phân tích cú pháp, định dạng và xác thực số điện thoại
Bạn có thể cài đặt thư viện bằng trình soạn thảo, sau đó sử dụng thư viện trong mã của bạn
Ví dụ sau đây cho thấy cách bạn có thể phân tích cú pháp một số điện thoại từ Brazil
<?php require __DIR__ . "/vendor/autoload.php"; use libphonenumber\NumberParseException; use libphonenumber\PhoneNumber; use libphonenumber\PhoneNumberFormat; use libphonenumber\PhoneNumberUtil; $phoneUtil = PhoneNumberUtil::getInstance(); $phone_no = "+55-955-590-0169"; try { // 👇 parse the number, pass the country code as second parameter $parsed_number = $phoneUtil->parse($phone_no, "BR"); // 👇 get detailed output print "Input: " . $phone_no . "\n"; print "Valid number: " . ($phoneUtil->isValidNumber($parsed_number) ? "true" : "false"); print PHP_EOL; print "E164: " . $phoneUtil->format($parsed_number, PhoneNumberFormat::E164); print PHP_EOL; print "National: " . $phoneUtil->format($parsed_number, PhoneNumberFormat::NATIONAL); print PHP_EOL; print "International: " . $phoneUtil->format($parsed_number, PhoneNumberFormat::INTERNATIONAL); print PHP_EOL; } catch (NumberParseException $e) { var_dump($e); }
Đầu ra của đoạn mã trên sẽ là
Input: +55-955-590-0169 Valid number: true E164: +559555900169 National: (95) 5590-0169 International: +55 95 5590-0169
Thay vì viết thư viện của riêng bạn, bạn có thể sử dụng function format_phone(string $phone_no) { return preg_replace( "/.*(\d{3})[^\d]{0,7}(\d{3})[^\d]{0,7}(\d{4})/", '($1) $2-$3', $phone_no ); } print format_phone("+1-555-549-4137"); // (555) 549-4137 print PHP_EOL; print format_phone("(555) 096 7286"); // (555) 096-7286 0 để giúp bạn dễ dàng định dạng số điện thoại