- Hàm chuyển tiếng Việt có dấu thành không dấu
- Tạo URL thân thiện từ chuỗi tiếng Việt
- Áp dụng cho diễn đàn XenForo
Xây dựng hàm chuyển tiếng Việt có dấu sang không dấu
Khi xử lý dữ liệu tiếng Việt trong PHP, đôi khi bạn cần chuyển chuỗi có dấu thành chuỗi không dấu để dùng cho tìm kiếm, tạo URL hoặc chuẩn hóa dữ liệu.
Cách đơn giản là sử dụng các hàm xử lý chuỗi trong PHP để tìm và thay thế ký tự. Ví dụ cơ bản với str_replace():
$chuoi = 'XUÂNTHULAB.NÉT'; $mang_kytu_goc = ['Â', 'É']; $mang_kytu_thaythe = ['A', 'E']; $ketqua = str_replace($mang_kytu_goc, $mang_kytu_thaythe, $chuoi); echo $ketqua; // XUANTHULAB.NET
Để chuyển đổi đầy đủ tiếng Việt có dấu thành không dấu, ta xây dựng một hàm tổng quát như sau:
function convert_vn2latin($str)
{
$tv_unicode_tohop = [
"à","á","ạ","ả","ã","â","ầ","ấ","ậ","ẩ","ẫ","ă","ằ","ắ","ặ","ẳ","ẵ",
"è","é","ẹ","ẻ","ẽ","ê","ề","ế","ệ","ể","ễ",
"ì","í","ị","ỉ","ĩ",
"ò","ó","ọ","ỏ","õ","ô","ồ","ố","ộ","ổ","ỗ","ơ","ờ","ớ","ợ","ở","ỡ",
"ù","ú","ụ","ủ","ũ","ư","ừ","ứ","ự","ử","ữ",
"ỳ","ý","ỵ","ỷ","ỹ",
"đ",
"À","Á","Ạ","Ả","Ã","Â","Ầ","Ấ","Ậ","Ẩ","Ẫ","Ă","Ằ","Ắ","Ặ","Ẳ","Ẵ",
"È","É","Ẹ","Ẻ","Ẽ","Ê","Ề","Ế","Ệ","Ể","Ễ",
"Ì","Í","Ị","Ỉ","Ĩ",
"Ò","Ó","Ọ","Ỏ","Õ","Ô","Ồ","Ố","Ộ","Ổ","Ỗ","Ơ","Ờ","Ớ","Ợ","Ở","Ỡ",
"Ù","Ú","Ụ","Ủ","Ũ","Ư","Ừ","Ứ","Ự","Ử","Ữ",
"Ỳ","Ý","Ỵ","Ỷ","Ỹ",
"Đ"
];
$tv_unicode_dungsan = [
"à","á","ạ","ả","ã","â","ầ","ấ","ậ","ẩ","ẫ","ă","ằ","ắ","ặ","ẳ","ẵ",
"è","é","ẹ","ẻ","ẽ","ê","ề","ế","ệ","ể","ễ",
"ì","í","ị","ỉ","ĩ",
"ò","ó","ọ","ỏ","õ","ô","ồ","ố","ộ","ổ","ỗ","ơ","ờ","ớ","ợ","ở","ỡ",
"ù","ú","ụ","ủ","ũ","ư","ừ","ứ","ự","ử","ữ",
"ỳ","ý","ỵ","ỷ","ỹ",
"đ",
"À","Á","Ạ","Ả","Ã","Â","Ầ","Ấ","Ậ","Ẩ","Ẫ","Ă","Ằ","Ắ","Ặ","Ẳ","Ẵ",
"È","É","Ẹ","Ẻ","Ẽ","Ê","Ề","Ế","Ệ","Ể","Ễ",
"Ì","Í","Ị","Ỉ","Ĩ",
"Ò","Ó","Ọ","Ỏ","Õ","Ô","Ồ","Ố","Ộ","Ổ","Ỗ","Ơ","Ờ","Ớ","Ợ","Ở","Ỡ",
"Ù","Ú","Ụ","Ủ","Ũ","Ư","Ừ","Ứ","Ự","Ử","Ữ",
"Ỳ","Ý","Ỵ","Ỷ","Ỹ",
"Đ"
];
$tv_khongdau = [
"a","a","a","a","a","a","a","a","a","a","a","a","a","a","a","a","a",
"e","e","e","e","e","e","e","e","e","e","e",
"i","i","i","i","i",
"o","o","o","o","o","o","o","o","o","o","o","o","o","o","o","o","o",
"u","u","u","u","u","u","u","u","u","u","u",
"y","y","y","y","y",
"d",
"A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A",
"E","E","E","E","E","E","E","E","E","E","E",
"I","I","I","I","I",
"O","O","O","O","O","O","O","O","O","O","O","O","O","O","O","O","O",
"U","U","U","U","U","U","U","U","U","U","U",
"Y","Y","Y","Y","Y",
"D"
];
$str = str_replace($tv_unicode_dungsan, $tv_khongdau, $str);
$str = str_replace($tv_unicode_tohop, $tv_khongdau, $str);
return $str;
}
Ví dụ sử dụng:
echo convert_vn2latin('Xây dựng hàm chuyển tiếng Việt có dấu sang không dấu.');
// Kết quả:
// Xay dung ham chuyen tieng Viet co dau sang khong dau
Tạo URL thân thiện từ chuỗi tiếng Việt
Trong ứng dụng PHP, tiêu đề bài viết hoặc tên sản phẩm thường được dùng để tạo URL. Khi đó, chuỗi cần được chuyển thành dạng không dấu, viết thường và thay khoảng trắng bằng dấu gạch ngang.
function url_normal($str)
{
$str = convert_vn2latin($str);
$str = mb_strtolower($str, 'UTF-8');
$str = preg_replace('/[^a-z0-9]+/', '-', $str);
$str = trim($str, '-');
return $str;
}
Ví dụ:
echo url_normal('Xây dựng hàm chuyển tiếng Việt có dấu sang không dấu.');
// Kết quả:
// xay-dung-ham-chuyen-tieng-viet-co-dau-sang-khong-dau
Chuỗi kết quả có thể dùng để tạo URL thân thiện cho website.
Áp dụng cho diễn đàn XenForo
XenForo có sẵn chức năng tạo URL thân thiện cho SEO. Tuy nhiên với tiêu đề tiếng Việt, đôi khi URL vẫn giữ lại ký tự có dấu.
Nếu muốn chuyển URL tiếng Việt thành không dấu hoàn toàn, bạn có thể can thiệp vào quá trình tạo link của XenForo.
File xử lý URL của XenForo
Trong XenForo, phần xử lý link nằm trong file:
library/XenForo/Link.php
Trong lớp XenForo_Link, thêm hàm chuyển đổi:
public static function convert_url_vn($title)
{
$title = self::convert_vn2latin($title);
$title = mb_strtolower($title, 'UTF-8');
$title = preg_replace('/[^a-z0-9]+/', '-', $title);
$title = trim($title, '-');
return $title;
}
Thay đổi hàm tạo URL
Tìm đến hàm getTitleForUrl() và thay đoạn:
$title = strtr($title, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz');
Bằng:
$title = self::convert_url_vn($title);
Sau khi cập nhật, kiểm tra lại URL bài viết hoặc chủ đề tiếng Việt trên XenForo.
Lưu ý: Việc chỉnh sửa trực tiếp mã nguồn XenForo có thể bị ghi đè khi nâng cấp. Nếu có thể, nên triển khai bằng addon hoặc override phù hợp với phiên bản bạn đang dùng.