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
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 Javascrip
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;
}
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 ) ;
}
Most Popular Articles
Làm sao để tăng tỉ lệ click chuột trong quảng cáo Adwords?
Có rất nhiều cách để tăng tỉ lệ CTR, tuy nhiên năm cách sau được các chuyên gia của Ad...
Tại sao phải xây dựng lại? Thiết kế website mới ?
Hầu hết, các website thiết kế theo công nghệ thiết kế web cũ, khó khăn trong cập nhật, thay đổi...
SEO khác quảng cáo google adwords như thế nào?
Bắt đầu với bài này tôi muốn hỏi bạn câu hỏi sau.Làm seo hay quảng cáo adwords?Nhiều người sử...
Cách nhận biết và lựa chọn Công ty Seo chuyên nghiệp
Làm thế nào để nhận biết Công ty Seo bạn chọn là Công ty Seo chuyên nghiệp?Với sự phát triển mạnh...
Top 10 thủ thuật SEO cần tránh xa
Công việc quảng bá Web, dịch vụ SEO, khá là toàn diện và phức tạp. Bởi các thuật toán của máy tìm...