it-swarm-vi.com

Làm thế nào để bạn loại bỏ các ký tự không hợp lệ khi tạo một url thân thiện (tức là làm thế nào để bạn tạo một con sên)?

Nói rằng tôi có trang web này: http://ww.xyz.com/Product.aspx?CategoryId=1

Nếu tên của CategoryId = 1 là "Chó", tôi muốn chuyển đổi URL thành một cái gì đó như thế này: http://ww.xyz.com/Products/Dogs

Vấn đề là nếu tên danh mục chứa các ký tự nước ngoài (hoặc không hợp lệ cho một url). Nếu tên của CategoryId = 2 là "Gotra äldre", URL mới sẽ là gì?

Về mặt logic, nó phải là: http://ww.xyz.com/Products/Göra äldre nhưng nó sẽ không hoạt động.

Thứ nhất là vì không gian (mà tôi có thể dễ dàng thay thế bằng dấu gạch ngang chẳng hạn) nhưng còn các ký tự nước ngoài thì sao? Trong Asp.net tôi có thể sử dụng hàm URLEncode sẽ cung cấp một cái gì đó như thế này: http://ww.xyz.com/Products/G%c3%b6ra+%c3%a4ldre nhưng tôi thực sự không thể nói nó tốt hơn URL ban đầu (http://ww.xyz.com/Product.aspx?CategoryId=2).

Lý tưởng nhất là tôi muốn tạo cái này nhưng làm thế nào tôi có thể tự động làm điều này (tức là chuyển đổi các ký tự nước ngoài thành các ký tự URL 'an toàn'): http://ww.xyz.com/Products/Gora-aldre.

6
Anthony

Tôi đã đưa ra 2 phương pháp mở rộng sau (asp.net/C #):

public static string RemoveAccent(this string txt)
{
    byte[] bytes = System.Text.Encoding.GetEncoding("Cyrillic").GetBytes(txt);
    return System.Text.Encoding.ASCII.GetString(bytes);
}

public static string Slugify(this string phrase)
{
    string str = phrase.RemoveAccent().ToLower();
    str = System.Text.RegularExpressions.Regex.Replace(str, @"[^a-z0-9\s-]", ""); // Remove all non valid chars          
    str = System.Text.RegularExpressions.Regex.Replace(str, @"\s+", " ").Trim(); // convert multiple spaces into one space  
    str = System.Text.RegularExpressions.Regex.Replace(str, @"\s", "-"); // //Replace spaces by dashes
    return str;
}
3
Anthony

Nó phụ thuộc vào ngôn ngữ bạn đang sử dụng và kỹ thuật bạn muốn sử dụng. Hãy xem đoạn mã JavaScript này từ nguồn Django, nó thực hiện chính xác những gì bạn cần. Tôi đoán bạn có thể dễ dàng chuyển nó sang ngôn ngữ bạn chọn.

Đây là đoạn Python được sử dụng trong hàm slugify Django, nó ngắn hơn rất nhiều:

def slugify(value):
    """
    Normalizes string, converts to lowercase, removes non-alpha characters,
    and converts spaces to hyphens.
    """
    import unicodedata
    value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore')
    value = unicode(re.sub('[^\w\s-]', '', value).strip().lower())
    return re.sub('[-\s]+', '-', value)

Tôi nghĩ rằng mọi ngôn ngữ đều có một cổng này, vì đó là một vấn đề phổ biến. Chỉ cần Google cho slugify + ngôn ngữ của bạn.

2
D4V360

Bạn có thể thêm một trường mới vào bảng Sản phẩm có chứa tên an toàn và duy nhất URL cho mỗi sản phẩm. Điều này có thể có thể được tạo tự động ban đầu (thay thế các ký tự không an toàn bằng tương đương an toàn gần nhất - gora-aldre?) Và sau đó tinh chỉnh khi cần.

Vì việc thay thế các ký tự không an toàn không phải là (luôn luôn) có thể đảo ngược, nên việc thực hiện điều này là hoàn toàn không khả thi.

Ngoài ra, bạn xây dựng URL như vậy:

http://example.com/products/1234/safe-string

Trong đó safe-string được tạo khi đang bay thay thế các ký tự không an toàn khi cần. Số 1234 là khóa sản phẩm. Bạn sử dụng chìa khóa để tra cứu sản phẩm, 'chuỗi an toàn' có nhiều hơn cho người dùng và công cụ tìm kiếm.

1
Kris

Hai điều cần ghi nhớ:

  1. Viết lại URL nói chung không có tác động tích cực đến các công cụ tìm kiếm (và thường là tiêu cực) - vì vậy bạn chỉ nên làm điều đó nếu bạn biết về tác động tích cực có thể đo lường được đối với sự hài lòng của người dùng (và theo đó: làm cho URL của bạn hữu ích cho người dùng) .

  2. Nếu bạn quyết định viết lại URL, bạn phải có các chi tiết kỹ thuật hoàn hảo. Chẳng hạn, bạn không bao giờ nên có nhiều hơn một URL duy nhất hiển thị cùng một nội dung. Đảm bảo bạn sử dụng UTF-8 để mã hóa nội dung không phải ASCII, sử dụng các liên kết đã thoát trong nội dung của bạn và thường kiểm tra trên các trình duyệt khác nhau để đảm bảo mọi thứ hoạt động như kế hoạch. Nếu bất kỳ điều nào trong số này là xa lạ với bạn, thì tôi thực sự khuyên bạn không nên viết lại URL vào lúc này.

FWIW Một số vấn đề về phía công cụ tìm kiếm được đề cập tại http://googlewebmastercentral.blogspot.com/2008/09/dynamic-urls-vs-static-urls.html

1
John Mueller

Phương pháp tốt nhất IMO là danh sách trắng ký tự thay vì cố gắng tìm kiếm các ký tự không hợp lệ. Tuy nhiên, các ký tự có dấu như é khá phổ biến (và URL của bạn sẽ là số lẻ nếu không có chúng) để bạn có thể chuyển đổi các ký tự này trước.

Trong PHP bạn có thể sử dụng hàm strtr, nhưng bạn sẽ có thể sửa đổi điều này cho nhu cầu của mình trên asp.net:

strtr(
  'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿŔŕ',
  'aaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyybyrr'
);

Bây giờ đây là quá trình của bạn:

  1. [tùy chọn] Chuyển đổi chuỗi thành chữ thường (thường được đề xuất cho URL).
  2. [tùy chọn] Chuyển đổi các ký tự có dấu bằng cách sử dụng ánh xạ trên.
  3. Chạy qua từng ký tự chuỗi ký tự của bạn.
  4. Có thể nhanh hơn để thực hiện # 1 và # 2 cho mỗi ký tự thay vì trên toàn bộ chuỗi, tùy thuộc vào chức năng tích hợp nào bạn có.
  5. Nếu ký tự nằm trong phạm vi a-z hoặc -9, hãy thêm nó vào chuỗi mới của bạn, nếu không:
    [.__.] a) Nếu bạn đã có dấu gạch nối ở cuối chuỗi mới, hãy bỏ qua nó
    [.___.] b) Nếu không, hãy thêm dấu gạch nối vào cuối chuỗi.
  6. Khi bạn đi đến cuối, loại bỏ và dẫn hoặc dấu gạch nối và bạn đã hoàn tất!
1
DisgruntledGoat

Vì bài đăng của bạn được gắn thẻ ASP.Net: nhìn vào trang web này , nó chứa mã mẫu để thay thế (hầu hết) văn bản bằng dấu phụ (ký tự không hợp lệ bạn gọi chúng) bằng ký tự cơ sở của chúng.

Như Kris đã đề cập, sử dụng ID duy nhất trong url của bạn, giống như trang web này. Nếu bạn không có quyền kiểm soát đối với ID được cung cấp cho bạn, bạn nên tạo một bảng dịch, có chứa ID duy nhất của bạn, với ID duy nhất bên ngoài. Bằng cách đó, tài liệu tham khảo nội bộ của bạn cũng tốt khi ID bên ngoài thay đổi. Cùng với ID duy nhất của bạn, bạn lưu trữ "ID được tìm kiếm và tối ưu hóa con người" của bạn, một ID không quá độc đáo, nhưng có vẻ tốt.

0
GvS

Wikipedia thường sử dụng các ký tự không phải là latin1 trong các URL của họ. Không có lý do nào (ngoài máy chủ web của bạn không hỗ trợ họ) rằng bạn không nên sử dụng các URL này.

Tuy nhiên; Nếu bạn phải tránh các ký tự này, tôi đã thấy rằng việc thay thế chúng bằng biểu mẫu không - diacritic của chúng. Hầu hết những người đọc những điều này có thể cho biết (từ ngữ cảnh) những gì được cho là Lời mặc dù các dấu phụ đã bị loại bỏ.

0
Greg B