Đây là bản trình 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 một phương pháp được chấp nhận rộng rãi để loại bỏ dấu.
- Bộ nhớ đệm Regex rõ ràng để cải thiện tốc độ khiêm tốn.
- Nhiều dấu tách từ hơn được nhận dạng và chuẩn hóa thành dấu gạch nối.
Đây là mã:
public class UrlSlugger
{
static readonly Regex WordDelimiters = new Regex(@"[\s—–_]", RegexOptions.Compiled);
static readonly Regex InvalidChars = new Regex(@"[^a-z0-9\-]", RegexOptions.Compiled);
static readonly Regex MultipleHyphens = new Regex(@"-{2,}", RegexOptions.Compiled);
public static string ToUrlSlug(string value)
{
value = value.ToLowerInvariant();
value = RemoveDiacritics(value);
value = WordDelimiters.Replace(value, "-");
value = InvalidChars.Replace(value, "");
value = MultipleHyphens.Replace(value, "-");
return value.Trim('-');
}
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));
}
}
Điều này vẫn không giải quyết được vấn đề ký tự không phải là ký tự latin. Một giải pháp hoàn toàn thay thế sẽ là sử dụng Uri.EscapeDataString để chuyển đổi chuỗi thành biểu diễn hex của nó:
string original = "测试公司";
string converted = Uri.EscapeDataString(original);
Sau đó, sử dụng dữ liệu để tạo siêu kết nối:
<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ị các ký tự Trung Quốc trên thanh địa chỉ (xem bên dưới), nhưng dựa trên thử nghiệm hạn chế của tôi, nó không được hỗ trợ hoàn toàn.
LƯU Ý: Để Uri.EscapeDataString hoạt động theo cách này, iriParsing phải được bật.
BIÊN TẬP
Đối với những người đang tìm cách tạo URL Slugs trong C #, tôi khuyên bạn nên xem câu hỏi liên quan này:
Làm cách nào để Stack Overflow tạo ra các URL thân thiện với SEO?
Đó là những gì tôi đã sử dụng cho dự án của mình.