Dưới đây là màn biểu diễn của tôi dựa trên câu trả lời của Joan và Marcel. Những thay đổi tôi đã thực hiện như sau:
- Sử dụng phương pháp widely accepted để xóa dấu trọng âm.
- Bộ nhớ đệm Regex rõ ràng để cải thiện tốc độ khiêm tốn.
- Dấu phân tách từ khác được nhận dạng và chuẩn hóa thành dấu gạch nối.
Đây là mã:
public class UrlSlugger
{
// white space, em-dash, en-dash, underscore
static readonly Regex WordDelimiters = new Regex(@"[\s—–_]", RegexOptions.Compiled);
// characters that are not valid
static readonly Regex InvalidChars = new Regex(@"[^a-z0-9\-]", RegexOptions.Compiled);
// multiple hyphens
static readonly Regex MultipleHyphens = new Regex(@"-{2,}", RegexOptions.Compiled);
public static string ToUrlSlug(string value)
{
// convert to lower case
value = value.ToLowerInvariant();
// remove diacritics (accents)
value = RemoveDiacritics(value);
// ensure all word delimiters are hyphens
value = WordDelimiters.Replace(value, "-");
// strip out invalid characters
value = InvalidChars.Replace(value, "");
// replace multiple hyphens (-) with a single hyphen
value = MultipleHyphens.Replace(value, "-");
// trim hyphens (-) from ends
return value.Trim('-');
}
/// See: http://www.siao2.com/2007/05/14/2629747.aspx
private static string RemoveDiacritics(string stIn)
{
string stFormD = stIn.Normalize(NormalizationForm.FormD);
StringBuilder sb = new StringBuilder();
for (int ich = 0; ich < stFormD.Length; ich++)
{
UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]);
if (uc != UnicodeCategory.NonSpacingMark)
{
sb.Append(stFormD[ich]);
}
}
return (sb.ToString().Normalize(NormalizationForm.FormC));
}
}
này vẫn không giải quyết được vấn đề nhân vật phi latin. Một giải pháp hoàn toàn thay thế sẽ được sử dụng Uri.EscapeDataString để chuyển đổi chuỗi đại diện hex của nó:
string original = "测试公司";
// %E6%B5%8B%E8%AF%95%E5%85%AC%E5%8F%B8
string converted = Uri.EscapeDataString(original);
Sau đó, sử dụng dữ liệu để tạo ra một siêu liên kết:
<a href="http://www.example.com/100/%E6%B5%8B%E8%AF%95%E5%85%AC%E5%8F%B8">
测试公司
</a>
Nhiều trình duyệt sẽ hiển thị chữ Hán trong địa chỉ thanh (xem bên dưới), nhưng dựa trên thử nghiệm giới hạn của tôi, nó không được hỗ trợ hoàn toàn.
LƯU Ý: Để Uri.EscapeDataString để làm việc theo cách này, iriParsing phải được bật.
EDIT
Đối với những người tìm kiếm để tạo URL sên trong C#, tôi khuyên bạn nên kiểm tra ra câu hỏi có liên quan này:
How does Stack Overflow generate its SEO-friendly URLs?
Đó là những gì tôi đã kết thúc sử dụng cho tôi dự án.
có nghĩa là gì để "slugify"? –
slugify = làm cho chuỗi do người dùng gửi an toàn để sử dụng như một phần của URL ... hoặc cơ sở dữ liệu hoặc bất kỳ thứ gì nhưng thường là URL. – chakrit