Một số cách chuyển đổi có dấu sang không dấu trong rewrite url

 

Tôi có đọc rất nhiều bài, các bạn hỏi sau khi đã biết cách rewrite url rằng: bây giờ không muốn viết là /1/Category/index.html mà muốn viết thành /1/Thoi-trang.html thì phải làm như thế nào?

Thật ra, đây cũng chỉ là một thủ thuật nhỏ mà thôi.

Tôi vẫn tiếp tục lấy ví dụ đối với url ở bên trên: http://powernet.vn/1/Thoi-trang.html, ở đây trong database chúng ta sẽ có bảng Categories(ID, CatName) với giá trị ID = 1, CatName = Thời trang.

Việc còn lại của bạn chỉ là viết một hàm để biến chuỗi ‘Thời trang' thành ‘Thoi-trang' mà thôi. Nguyên tắc như sau: gặp các ký tự không dấu thì giữ  nguyên, gặp ký tự có dấu thì replace thành không dấu ví dụ như ‘ờ' thì replace thành ‘o', các ký tự đặc biệt như dấu cách (space – cách trắng), hay ngoặc kép, ngoặc đơn thì replace thành dấu '-'.

Có rất nhiều cách để thực hiện điều này, bằng code C#, hay xử lý các Function ngay trong database.

Đây là hàm tôi viết bằng C# (sau khi kết hợp nhiều phương pháp khác nhau), tôi đặt tên là ConvertToUnSign

///

 

 

/// Hàm chuyển đổi chuỗi có dấu thành không dấu

///

 

 

///

///

public static string ConvertToUnSign(string text)

{

for (int i = 32; i < 48; i++)

{

text = text.Replace(((char)i).ToString(), " ");

}

text = text.Replace(".", "-");

text = text.Replace(" ", "-");

text = text.Replace(",", "-");

text = text.Replace(";", "-");

text = text.Replace(":", "-");

 

Regex regex = new Regex(@"\p{IsCombiningDiacriticalMarks}+");

 

string strFormD = text.Normalize(System.Text.NormalizationForm.FormD);

return regex.Replace(strFormD, String.Empty).Replace('\u0111','d').Replace('\u0110', 'D');

}

 

Nếu muốn xử lý trong database thì tôi có sưu tầm được 1 Function của bác Admin trong HMWeb.com.vn

 

CREATE FUNCTION [dbo].[fuChuyenCoDauThanhKhongDau]

(

@strInput NVARCHAR(4000)

)

RETURNS NVARCHAR(4000)

AS

BEGIN

IF @strInput IS NULL RETURN @strInput

IF @strInput = '' RETURN @strInput

DECLARE @RT NVARCHAR(4000)

DECLARE @SIGN_CHARS NCHAR(136)

DECLARE @UNSIGN_CHARS NCHAR (136)

 

SET @SIGN_CHARS = N'ăâđêôơưàảãạáằẳẵặắầẩẫậấèẻẽẹéềểễệế

ìỉĩịíòỏõọóồổỗộốờởỡợớùủũụúừửữựứỳỷỹỵý

ĂÂĐÊÔƠƯÀẢÃẠÁẰẲẴẶẮẦẨẪẬẤÈẺẼẸÉỀỂỄỆẾÌỈĨỊÍ

ÒỎÕỌÓỒỔỖỘỐỜỞỠỢỚÙỦŨỤÚỪỬỮỰỨỲỶỸỴÝ'

+NCHAR(272)+ NCHAR(208)

SET @UNSIGN_CHARS = N'aadeoouaaaaaaaaaaaaaaaeeeeeeeeee

iiiiiooooooooooooooouuuuuuuuuuyyyyy

AADEOOUAAAAAAAAAAAAAAAEEEEEEEEEEIIIII

OOOOOOOOOOOOOOOUUUUUUUUUUYYYYYDD'

 

DECLARE @COUNTER int

DECLARE @COUNTER1 int

SET @COUNTER = 1

 

WHILE (@COUNTER <=LEN(@strInput))

BEGIN

SET @COUNTER1 = 1

--Tìm trong chuỗi mẫu

WHILE (@COUNTER1 <=LEN(@SIGN_CHARS)+1)

BEGIN

IF UNICODE(SUBSTRING(@SIGN_CHARS, @COUNTER1,1))

= UNICODE(SUBSTRING(@strInput,@COUNTER ,1) )

BEGIN

IF @COUNTER=1

SET @strInput = SUBSTRING(@UNSIGN_CHARS, @COUNTER1,1)

+ SUBSTRING(@strInput, @COUNTER+1,LEN(@strInput)-1)

ELSE

SET @strInput = SUBSTRING(@strInput, 1, @COUNTER-1)

+SUBSTRING(@UNSIGN_CHARS, @COUNTER1,1)

+ SUBSTRING(@strInput, @COUNTER+1,LEN(@strInput)- @COUNTER)

BREAK

END

SET @COUNTER1 = @COUNTER1 +1

END

--Tìm tiếp

SET @COUNTER = @COUNTER +1

END

SET @strInput = replace(@strInput,' ','-')

RETURN @strInput

END

 

Cách gọi ra khi cần convert như sau:

SELECT dbo.fuChuyenCoDauThanhKhongDau (CatName) FROM Categories

Với CatName = ‘Thời trang' chúng ta sẽ có kết quả là ‘thoi-trang'.

Như vậy đến bước này, chúng ta đã biết thêm cách để chuyển đổi một chuỗi có dấu thành chuỗi không dấu, chỉ cần sử dụng chuỗi này và truyền vào các parameter trong rule, chúng ta sẽ có những liên kết thân thiện với người dùng hơn rất nhiều so với các query chỉ có các ID là những chữ số khó hiểu.

 

 

Bài viết này có hữu ích?

730 Khách hàng đánh giá tốt (997 Đánh giá)
 In bài viết

Nên đọc

Hướng dẫn nén và giải nén trên DirectAdmin

Chào bạn ! Có nhiều bạn thắc mắc làm cách nào để tạo file...

Hướng dẫn sử dụng Sypex - Backup và Restore Database

Sypex SQL Dumper thực sự làm món đồ không thể thiếu dành cho việc backup (sao lưu) và restore...

Những vấn đề cần quan tâm khi muốn thuê 1 hosting

Mình thấy nhiều bạn luôn thắc mắc các thông số kỹ thuật khi muốn thuê 1 hosting đặc biệt là...

Khắc phục lỗi Joomla Fatal error: Allowed memory size of 134217728 bytes exhausted

Đầu tiên, Bạn vào file configuration.php sửa những thông số sau: var $caching = '1'; thành  var...

Lỡ tay xóa thư mục public_html, làm sao để tạo lại?

Nếu là lỡ tay xóa shortcut của public_html thì bạn có thể vào bằng đường dẫn này....