2008-09-01 47 views
26

Làm cách nào để tạo URL thân thiện trong C#? Hiện tại tôi đơn giản thay thế không gian bằng dấu gạch dưới, nhưng làm thế nào tôi có thể tạo URL giống như Stack Overflow?Làm cách nào để tạo URL thân thiện trong C#?

Ví dụ làm thế nào tôi có thể chuyển đổi:

Làm thế nào để tạo ra một URL thân thiện trong C#?

Into

cách-do-i-tạo-một-thân thiện-url-in-C

Trả lời

46

Mặc dù vậy, có một số điều có thể được cải thiện trong giải pháp của Jeff.

if (String.IsNullOrEmpty(title)) return ""; 

IMHO, không phải là nơi để kiểm tra điều này. Nếu hàm được truyền qua một chuỗi rỗng, thì có điều gì đó đã bị lỗi nghiêm trọng. Ném một lỗi hoặc không phản ứng gì cả.

// remove any leading or trailing spaces left over 
… muuuch later: 
// remove trailing dash, if there is one 

Hai lần công việc. Xem xét rằng mỗi hoạt động tạo ra một chuỗi hoàn toàn mới, điều này là xấu, ngay cả khi hiệu suất không phải là một vấn đề.

// replace spaces with single dash 
title = Regex.Replace(title, @"\s+", "-"); 
// if we end up with multiple dashes, collapse to single dash    
title = Regex.Replace(title, @"\-{2,}", "-"); 

Một lần nữa, về cơ bản gấp đôi công việc: Trước tiên, sử dụng regex để thay thế nhiều dấu cách cùng một lúc. Sau đó, sử dụng lại regex để thay thế nhiều dấu gạch ngang cùng một lúc. Hai biểu thức để phân tích cú pháp, hai automata để xây dựng trong bộ nhớ, lặp lại hai lần trên chuỗi, tạo hai chuỗi: Tất cả các hoạt động này có thể được thu gọn thành một chuỗi duy nhất.

Off đỉnh đầu của tôi, mà không cần bất kỳ thử nghiệm nào, đây sẽ là một giải pháp tương đương:

// make it all lower case 
title = title.ToLower(); 
// remove entities 
title = Regex.Replace(title, @"&\w+;", ""); 
// remove anything that is not letters, numbers, dash, or space 
title = Regex.Replace(title, @"[^a-z0-9\-\s]", ""); 
// replace spaces 
title = title.Replace(' ', '-'); 
// collapse dashes 
title = Regex.Replace(title, @"-{2,}", "-"); 
// trim excessive dashes at the beginning 
title = title.TrimStart(new [] {'-'}); 
// if it's too long, clip it 
if (title.Length > 80) 
    title = title.Substring(0, 79); 
// remove trailing dashes 
title = title.TrimEnd(new [] {'-'}); 
return title; 

Chú ý rằng phương pháp này sử dụng các chức năng chuỗi thay vì chức năng regex và chức năng char thay vì chức năng chuỗi bất cứ khi nào có thể .

+1

Cảm ơn câu trả lời tuyệt vời, tôi cũng đã thêm URL = Regex.Replace (URL, @ "<(.|\n)*?>", ""); để xóa thẻ HTML là "số bài viết tại đây" của tôi "sẽ chuyển sang" my-barticleb-here " –

+0

Đường dẫn cũng không thể kết thúc bằng dấu chấm. Cũng không chắc chắn lý do tại sao bạn sử dụng [] {'-'} mới, khi bạn chỉ có thể sử dụng '-'. –

18

Đây là cách chúng tôi làm điều đó. Lưu ý rằng có điều kiện cạnh có lẽ nhiều hơn bạn nhận ra ở cái nhìn đầu tiên ..

if (String.IsNullOrEmpty(title)) return ""; 

// remove entities 
title = Regex.Replace(title, @"&\w+;", ""); 
// remove anything that is not letters, numbers, dash, or space 
title = Regex.Replace(title, @"[^A-Za-z0-9\-\s]", ""); 
// remove any leading or trailing spaces left over 
title = title.Trim(); 
// replace spaces with single dash 
title = Regex.Replace(title, @"\s+", "-"); 
// if we end up with multiple dashes, collapse to single dash    
title = Regex.Replace(title, @"\-{2,}", "-"); 
// make it all lower case 
title = title.ToLower(); 
// if it's too long, clip it 
if (title.Length > 80) 
    title = title.Substring(0, 79); 
// remove trailing dash, if there is one 
if (title.EndsWith("-")) 
    title = title.Substring(0, title.Length - 1); 
return title; 
+8

Câu trả lời này đã lỗi thời. Jeff cập nhật câu trả lời ban đầu của anh ấy bằng phiên bản mới của mã: http://stackoverflow.com/questions/25259/how-do-you-include-a-webpage-title-as-part-of-a-webpage-url/25486 # 25486 –

4

này được một phần của con đường đó (sử dụng một danh sách trắng của ký tự hợp lệ):

new Regex("[^a-zA-Z-_]").Replace(s, "-") 

Nó, tuy nhiên , cung cấp cho bạn một chuỗi kết thúc bằng "-". Vì vậy, có lẽ một regex thứ hai để cắt những người từ đầu/cuối của chuỗi, và có thể thay thế bất kỳ nội bộ "-" để "-".

Các vấn đề liên quan