Jan 04

Xử lý dấu tiếng Việt - Link URL thân thiện SEO

Tại sao cần thân thiện hoá đường dẫn URL ?

Trong quá trình lập trình xử lý tiếng Việt (search, SEO, thao tác chuỗi ký tự ..) các bạn sẽ gặp phải vấn đề xử lý chuỗi tiếng Việt có dấu.

Trong khuân khổ bài viết, tớ chỉ xin đề cập tới ứng dụng trong SEO. Nếu ai quan tâm đến SEO thì không thể bỏ qua phương pháp viết lại đường dẫn (url rewrite, mod_rewrite hay còn gọi là Friendly URL gọi tắt là FURL) giúp cho đường link gọn, ý nghĩa và có thể chèn thêm từ khóa trong đường dẫn FURL này.

Thông thường rất nhiều Webmaster sẽ lấy tiêu đề (title) hay phần miêu tả (description) để nhúng vào đường dẫn FURL. Để tránh các ký tự đặc biệt bị thay bởi mã HTML trong địa chỉ URL trên thanh địa chỉ của trình duyệt (adress bar), người ta thường xử lý loại bỏ hoặc thay thế các ký tự đặc biệt này bằng các ký tự tương đương trong bẳng mã HTML.

Với tiếng Anh hay các ngôn ngữ gốc Latin khác thì khá đơn giản. Nhưng khi xử lý chuỗi tiếng Việt để đưa tiêu đề vào FURL chẳng hạn thì có nhiều trường hợp. Phải liệt kê hết các ký tự đặc biết.

Phần hướng dẫn này mình sẽ chia sẻ cho các bạn các hàm PHP, JavaScript để xử lý chuỗi dấu tiếng Việt.

Hàm PHP xử lý dấu tiếng Việt

function RemoveSign($str)
{
$coDau=array("à","á","ạ","ả","ã","â","ầ","ấ","ậ","ẩ","ẫ","ă","ằ","ắ"
,"ặ","ẳ","ẵ","è","é","ẹ","ẻ","ẽ","ê","ề","ế","ệ","ể","ễ","ì","í","ị","ỉ","ĩ",
"ò","ó","ọ","ỏ","õ","ô","ồ","ố","ộ","ổ","ỗ","ơ"
,"ờ","ớ","ợ","ở","ỡ",
"ù","ú","ụ","ủ","ũ","ư","ừ","ứ","ự","ử","ữ",
"ỳ","ý","ỵ","ỷ","ỹ",
"đ",
"À","Á","Ạ","Ả","Ã","Â","Ầ","Ấ","Ậ","Ẩ","Ẫ","Ă"
,"Ằ","Ắ","Ặ","Ẳ","Ẵ",
"È","É","Ẹ","Ẻ","Ẽ","Ê","Ề","Ế","Ệ","Ể","Ễ",
"Ì","Í","Ị","Ỉ","Ĩ",
"Ò","Ó","Ọ","Ỏ","Õ","Ô","Ồ","Ố","Ộ","Ổ","Ỗ","Ơ"
,"Ờ","Ớ","Ợ","Ở","Ỡ",
"Ù","Ú","Ụ","Ủ","Ũ","Ư","Ừ","Ứ","Ự","Ử","Ữ",
"Ỳ","Ý","Ỵ","Ỷ","Ỹ",
"Đ","ê","ù","à");
$khongDau=array("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","e","u","a");
return str_replace($coDau,$khongDau,$str);
}

Hàm tiếp theo cũng tương tự
[source:php]
$cs=”Thật là lắm chuyện”;
$marTViet=array(”à”,”á”,”ạ”,”ả”,”ã”,”â”,”ầ”,”ấ”,”ậ”,”ẩ”,”ẫ”,”ă”,
“ằ”,”ắ”,”ặ”,”ẳ”,”ẵ”,”è”,”é”,”ẹ”,”ẻ”,”ẽ”,”ê”,”ề”
,”ế”,”ệ”,”ể”,”ễ”,
“ì”,”í”,”ị”,”ỉ”,”ĩ”,
“ò”,”ó”,”ọ”,”ỏ”,”õ”,”ô”,”ồ”,”ố”,”ộ”,”ổ”,”ỗ”,”ơ”
,”ờ”,”ớ”,”ợ”,”ở”,”ỡ”,
“ù”,”ú”,”ụ”,”ủ”,”ũ”,”ư”,”ừ”,”ứ”,”ự”,”ử”,”ữ”,
“ỳ”,”ý”,”ỵ”,”ỷ”,”ỹ”,
“đ”,
“À”,”Á”,”Ạ”,”Ả”,”Ô,””,”Ầ”,”Ấ”,”Ậ”,”Ẩ”,”Ẫ”,”Ă”
,”Ằ”,”Ắ”,”Ặ”,”Ẳ”,”Ẵ”,
“È”,”É”,”Ẹ”,”Ẻ”,”Ẽ”,”Ê”,”Ề”,”Ế”,”Ệ”,”Ể”,”Ễ”,
“Ì”,”Í”,”Ị”,”Ỉ”,”Ĩ”,
“Ò”,”Ó”,”Ọ”,”Ỏ”,”Õ”,”Ô”,”Ồ”,”Ố”,”Ộ”,”Ổ”,”Ỗ”,”Ơ”
,”Ờ”,”Ớ”,”Ợ”,”Ở”,”Ỡ”,
“Ù”,”Ú”,”Ụ”,”Ủ”,”Ũ”,”Ư”,”Ừ”,”Ứ”,”Ự”,”Ử”,”Ữ”,
“Ỳ”,”Ý”,”Ỵ”,”Ỷ”,”Ỹ”,
“Đ”);
$marKoDau=array(”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”);
echo str_replace($marTViet,$marKoDau,$cs);[/source]
Đoạn mã trên sẽ in ra màn hình dòng chữ sau:

That la lam chuyen

Một bản khác dùng hàm preg_replace (tớ thích dùng hơn)

function khongdau($str) {
$str = preg_replace("/(à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ)/", 'a', $str);
$str = preg_replace("/(è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ)/", 'e', $str);
$str = preg_replace("/(ì|í|ị|ỉ|ĩ)/", 'i', $str);
$str = preg_replace("/(ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ)/", 'o', $str);
$str = preg_replace("/(ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ)/", 'u', $str);
$str = preg_replace("/(ỳ|ý|ỵ|ỷ|ỹ)/", 'y', $str);
$str = preg_replace("/(đ)/", 'd', $str);
$str = preg_replace("/(À|Á|Ạ|Ả|Ã|Â|Ầ|Ấ|Ậ|Ẩ|Ẫ|Ă|Ằ|Ắ|Ặ|Ẳ|Ẵ)/", 'A', $str);
$str = preg_replace("/(È|É|Ẹ|Ẻ|Ẽ|Ê|Ề|Ế|Ệ|Ể|Ễ)/", 'E', $str);
$str = preg_replace("/(Ì|Í|Ị|Ỉ|Ĩ)/", 'I', $str);
$str = preg_replace("/(Ò|Ó|Ọ|Ỏ|Õ|Ô|Ồ|Ố|Ộ|Ổ|Ỗ|Ơ|Ờ|Ớ|Ợ|Ở|Ỡ)/", 'O', $str);
$str = preg_replace("/(Ù|Ú|Ụ|Ủ|Ũ|Ư|Ừ|Ứ|Ự|Ử|Ữ)/", 'U', $str);
$str = preg_replace("/(Ỳ|Ý|Ỵ|Ỷ|Ỹ)/", 'Y', $str);
$str = preg_replace("/(Đ)/", 'D', $str);
//$str = str_replace(" ", "-", str_replace("&*#39;","",$str));
return $str;

Hàm Javascript

var ca = new Array (\"a\",\"à.á.ạ.ả.ã.â.ầ.ấ.ậ.ẩ.ẫ.ă.ằ.ắ.ặ.ẳ.ẵ.À.Á.Ạ.Ả.Ã.Â.Ầ.Ấ.Ậ.Ẩ.Ẫ.Ă.Ằ.Ắ.Ặ.Ẳ.Ẵ\"); var ce = new Array (\"e\",\"è.é.ẹ.ẻ.ẽ.ê.ề.ế.ệ.ể.ễ.È.É.Ẹ.Ẻ.Ẽ.Ê.Ề.Ế.Ệ.Ể.Ễ\"); var ci = new Array (\"i\",\"ì.í.ị.ỉ.ĩ.Ì.Í.Ị.Ỉ.Ĩ\");
var co = new Array (\"o\",\"ò.ó.ọ.ỏ.õ.ô.ồ.ố.ộ.ổ.ỗ.ơ.ờ.ớ.ợ.ở.ỡ.Ò.Ó.Ọ.Ỏ.Õ.Ô.Ồ.Ố.Ộ.Ổ.Ỗ.Ơ.Ờ.Ớ.Ợ.Ở.Ỡ\");
var cu = new Array (\"u\",\"ù.ú.ụ.ủ.ũ.ư.ừ.ứ.ự.ử.ữ.Ù.Ú.Ụ.Ủ.Ũ.Ư.Ừ.Ứ.Ự.Ử.Ữ\");
var cy = new Array (\"y\",\"ỳ.ý.ỵ.ỷ.ỹ.Ỳ.Ý.Ỵ.Ỷ.Ỹ\");
var cd = new Array (\"d\",\"đ.Đ\");
var cs = new Array (\"\",\"\\\\\\\\\\\\\\'.~.@.#.%.^.&\");
var bangkitucoso = new Array(ca,ce,ci,co,cu,cy,cd,cs);
function mLocDau(bv) { var markhongdau = new Array();
markhongdau[0]=bv; for (j=0; j < bangkitucoso.length; j++)
// max j = 8 { marthaythe = bangkitucoso[j][1].split(\\\\\\\\\\\\\\'.\\\\\\\\\\\\\\');
// tach cac chuoi co dau thanh tung phan tu rieng biet for (i=0; i < marthaythe.length; i++) { markhongdau[i+1] = mThayThe(markhongdau[i],marthaythe[i],bangkitucoso[j][0]); markhongdau[0]=markhongdau[i+1].toLowerCase(); } }
//end of for
// kiem tra loi injection
// document.getElementById(\\\\\\\\\\\\\\'uoon\\\\\\\\\\\\\\').innerHTML =markhongdau[0]; return markhongdau[0]; }
// ham nay co chuc nang tuong tu nhu str_replace trong php function mThayThe(ccha,cbithay,cthaythe) { var ccon = \"/\" + cbithay +\"/gi\"; var cmoi=ccha.replace(eval(ccon),cthaythe); return cmoi;}

Xử lý tiếng Việt cho Invision Power Board

Còn đây là hàm mà tớ sử dụng để viết lại đường dẫn FURL cho diễn đàn Invision Power Board với bẳng mã ISO-8859-1

function make_title_furl($text){
//global $ibforums;
//Charachters must be in ASCII and certain ones aint allowed
$text = html_entity_decode ($text);
$text = preg_replace("/(ä|à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ)/", 'a', $text);
$text = str_replace("ç","c",$text);
$text = preg_replace("/(è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ)/", 'e', $text);
$text = preg_replace("/(ì|í|î|ị|ỉ|ĩ)/", 'i', $text);
$text = preg_replace("/(ö|ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ)/", 'o', $text);
$text = preg_replace("/(ü|ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ)/", 'u', $text);
$text = preg_replace("/(ỳ|ý|ỵ|ỷ|ỹ)/", 'y', $text);
$text = preg_replace("/(đ)/", 'd', $text);
//CHU HOA
$text = preg_replace("/(Ä|À|Á|Ạ|Ả|Ã|Â|Ầ|Ấ|Ậ|Ẩ|Ẫ|Ă|Ằ|Ắ|Ặ|Ẳ|Ẵ)/", 'A', $text);
$text = str_replace("Ç","C",$text);
$text = preg_replace("/(È|É|Ẹ|Ẻ|Ẽ|Ê|Ề|Ế|Ệ|Ể|Ễ)/", 'E', $text);
$text = preg_replace("/(Ì|Í|Ị|Ỉ|Ĩ)/", 'I', $text);
$text = preg_replace("/(Ö|Ò|Ó|Ọ|Ỏ|Õ|Ô|Ồ|Ố|Ộ|Ổ|Ỗ|Ơ|Ờ|Ớ|Ợ|Ở|Ỡ)/", 'O', $text);
$text = preg_replace("/(Ü|Ù|Ú|Ụ|Ủ|Ũ|Ư|Ừ|Ứ|Ự|Ử|Ữ)/", 'U', $text);
$text = preg_replace("/(Ỳ|Ý|Ỵ|Ỷ|Ỹ)/", 'Y', $text);
$text = preg_replace("/(Đ)/", 'D', $text);
//Special string
$text = preg_replace("/( |!|"|#|$|%|')/", '', $text);
$text = preg_replace("/(̀|́|̉|$|>)/", '', $text);
$text = preg_replace ("'<[\/\!]*?[^<>]*?>'si", "", $text);
/*
$text = str_replace(" / ","-",$text);
$text = str_replace("/","-",$text);
$text = str_replace(" - ","-",$text);
$text = str_replace("_","-",$text);
$text = str_replace(" ","-",$text);
$text = str_replace( "ß", "ss", $text);
$text = str_replace( "&", "", $text);
$text = str_replace( "%", "", $text);
$text = ereg_replace("[^A-Za-z0-9-]", "", $text);
*/
$text = str_replace("----","-",$text);
$text = str_replace("---","-",$text);
$text = str_replace("--","-",$text);
return $text;
}


Link demo FURL với Invision Power Board :
Sinh viên Việt Nam FURL Rewrite.

Xử lý tiếng Việt cho Blogger WordPress

Với những người sử dụng blog WordPress nếu không chỉnh sửa đường dẫn bằng Post Slug thì khi bạn viết một tiêu đề tiếng Việt, các nguyên âm có dấu sẽ bị chuyển mã hó dạng %xx không thân thiện tí nào. Theo tác giả Quang Anh (onetruebrace.com) thì WordPress sử dụng hàm mang tên sanitize_title_with_dashes để chuyển đổi tiêu đề thành permalink có dấu ngạch ngang phân cách các từ :
add_filter(’sanitize_title’, ’sanitize_title_with_dashes’);
Tất cả những gì phải làm là thực thi hàm xử lý tiếng Việt có dấu sang dạng không dấu ngay trước hàm sanitize_title_with_dashes:

function qad_remove_accents ( $string ) {
$trans = array ( ‘à’=>’a’,’á’=>’a’,’ả’=>’a’,’ã’=>’a’,’ạ’=>’a’,
‘ă’=>’a’,’ằ’=>’a’,’ắ’=>’a’,’ẳ’=>’a’,’ẵ’=>’a’,’ặ’=>’a’,
‘â’=>’a’,’ầ’=>’a’,’ấ’=>’a’,’ẩ’=>’a’,’ẫ’=>’a’,’ậ’=>’a’,
‘À’=>’a’,’Á’=>’a’,’Ả’=>’a’,’Ã’=>’a’,’Ạ’=>’a’,
‘Ă’=>’a’,’Ằ’=>’a’,’Ắ’=>’a’,’Ẳ’=>’a’,’Ẵ’=>’a’,’Ặ’=>’a’,
‘Â’=>’a’,’Ầ’=>’a’,’Ấ’=>’a’,’Ẩ’=>’a’,’Ẫ’=>’a’,’Ậ’=>’a’,
‘đ’=>’d’,’Đ’=>’d’,
‘è’=>’e’,’é’=>’e’,’ẻ’=>’e’,’ẽ’=>’e’,’ẹ’=>’e’,
‘ê’=>’e’,’ề’=>’e’,’ế’=>’e’,’ể’=>’e’,’ễ’=>’e’,’ệ’=>’e’,
‘È’=>’e’,’É’=>’e’,’Ẻ’=>’e’,’Ẽ’=>’e’,’Ẹ’=>’e’,
‘Ê’=>’e’,’Ề’=>’e’,’Ế’=>’e’,’Ể’=>’e’,’Ễ’=>’e’,’Ệ’=>’e’,
 ‘ì’=>’i’,’í’=>’i’,’ỉ’=>’i’,’ĩ’=>’i’,’ị’=>’i’,
‘Ì’=>’i’,’Í’=>’i’,’Ỉ’=>’i’,’Ĩ’=>’i’,’Ị’=>’i’,
‘ò’=>’o’,’ó’=>’o’,’ỏ’=>’o’,’õ’=>’o’,’ọ’=>’o’,
‘ô’=>’o’,’ồ’=>’o’,’ố’=>’o’,’ổ’=>’o’,’ỗ’=>’o’,’ộ’=>’o’,
‘ơ’=>’o’,’ờ’=>’o’,’ớ’=>’o’,’ở’=>’o’,’ỡ’=>’o’,’ợ’=>’o’,
 ‘Ò’=>’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’,
‘Ù’=>’u’,’Ú’=>’u’,’Ủ’=>’u’,’Ũ’=>’u’,’Ụ’=>’u’,
‘Ư’=>’u’,’Ừ’=>’u’,’Ứ’=>’u’,’Ử’=>’u’,’Ữ’=>’u’,’Ự’=>’u’,
 ‘ỳ’=>’y’,’ý’=>’y’,’ỷ’=>’y’,’ỹ’=>’y’,’ỵ’=>’y’,
‘Y’=>’y’,’Ỳ’=>’y’,’Ý’=>’y’,’Ỷ’=>’y’,’Ỹ’=>’y’,’Ỵ’=>’y’
) ;return strtr ( $string , $trans ) ;
} 

Nguyễn Hoài Nam - vietSEO.net

Bài viết cùng chủ đề liên quan

  1. URL thân thiện với Search Engine (FURL)
    URL động và URL tối ưu hóa để thân thiện với các bộ máy tìm kiếm Theo mặc định, Wordpress đặt tên URL của blog theo một dãy số động...
  2. Sơ đồ liên kết - Website thân thiện với máy tìm kiếm
    Thứ hạng trang Web của bạn trong trang kết quả tìm kiếm phụ thuộc một phần vào cách phân tích các đường dẫn liên kết trỏ đến trang của bạn....
  3. 10 thủ thuật SEO tối ưu hóa tiêu đề thân thiện với Google
    Tiêu đề bài viết là một trong những ít thông tin mà máy tìm kiếm cung cấp cho người tìm kiếm trên trang kết quả trước khi nội dung được...
  4. Ebook sổ tay WordPress | Thủ thuật blog tiếng Việt toàn tập
    Trích lời tác giả VietTut : "Đây là phiên bản đầu tiên, Ebook này sẽ còn được cập nhật, chỉnh sửa và bổ sung thêm nhiều bài viết mới để...
  5. Không hiển thị các Affiliate Link
    Trước khi ẩn một affiliate link, xin hãy đọc kĩ các điều khoản qui định của chương trình affiliate mà bạn tham gia và chắc chắn rằng việc ẩn các...
  6. Độ dài bài viết và mức độ thường xuyên viết bài
    Độ dài của mỗi bài viết có thể từ một đoạn văn đến một bài luận dài 7000 từ. Bạn muốn dùng cách nào cũng được. Điều thực sự mấu...
Tags: , , , , , , , , , , , ,
4 lời bình cho “Xử lý dấu tiếng Việt - Link URL thân thiện SEO”
  1. Saokim999 Says:

    Cho mình hỏi nếu diễn đàn IBF dùngmax utf-8 thì bảng tren có dùng được ko
    Cách tạo FURL như http://aevn.fr/index.php ban có thẻ chỉ ko^^. mình dungbanf ibf 2.3.4
    ym: saokim_yrc
    thx

  2. quang ba Web Says:

    Bảng trên chính là dùng cho UTF-8 đó bạn, còn nếu muốn viết FURL như thế thì cậu có thể tham khảo MinvervaSEO trên Google nhé. Sau đó phải sửa lại code khác nhiều để tối ưu. Kết hợp với mấy hàm xử lý ký tự trên thì là rất tuyệt.

    Chúc thành công.

  3. xuan quang Says:

    Bác cho hỏi là với diễn đàn VBB, muốn dùng hàm PHP để chuyển đổi dấu thì save file dưới dạng gì?

  4. www.namln.com Says:

    Mình thấy những người sử dụng BlogSpot vẫn bị thiệt về vụ URL thân thiện này.

Bình luận của bạn