web-gelistirme-sc.com

Kolay bir URL oluştururken geçersiz karakterleri nasıl kaldırırsınız (örneğin, bir sümüklü böcek nasıl yaratılır)?

Diyelim ki bu web sayfam var: http://ww.xyz.com/Product.aspx?CategoryId=1

CategoryId = 1 adı "Köpekler" ise, URL'yi şunun gibi bir şeye dönüştürmek istiyorum: http://ww.xyz.com/Products/Dogs

Sorun, kategori adı yabancı (veya bir url için geçersiz) karakterler içeriyorsadır. CategoryId = 2 adı "Göra äldre" ise, yeni URL ne olmalıdır?

Mantıksal olarak şöyle olmalıdır: http://ww.xyz.com/Products/Göra äldre ama işe yaramayacak.

Öncelikle boşluk nedeniyle (örneğin bir tire ile kolayca değiştirebilirim) fakat yabancı karakterlerden ne haber? Asp.net'te şöyle bir şey verecek olan URLEncode işlevini kullanabilirim: http://ww.xyz.com/Products/G%c3%b6ra+%c3%a4ldre ama gerçekten orijinal URL'den (http://ww.xyz.com/Product.aspx?CategoryId=2) daha iyi olduğunu söyleyemem.

İdeal olarak bunu oluşturmak isterdim ama bunu otomatik olarak nasıl yapabilirim (yani yabancı karakterleri 'güvenli' URL karakterlerine dönüştürür): http://ww.xyz.com/Products/Gora-aldre.

6
Anthony

2 aşağıdaki uzatma yöntemlerini buldum (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

Kullandığınız dile ve kullanmak istediğiniz tekniğe bağlıdır. Bu JavaScript kod parçasına Django kaynağından bakın, tam olarak ihtiyacınız olanı yapar. Sanırım, seçtiğiniz dile kolayca yönlendirebilirsiniz.

Bu, Python slugify işlevinde kullanılan Django snippet, bu çok daha kısa:

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)

Her dilin bunun bir limanı olduğunu düşünüyorum, çünkü bu yaygın bir problem. Sadece Google slugify + dilinizi.

2
D4V360

Her ürün için URL güvenli ve benzersiz bir ad içeren Ürünler tablosuna yeni bir alan ekleyebilirsiniz. Bu muhtemelen başlangıçta otomatik olarak oluşturulabilir (güvenli olmayan karakterlerin en yakın güvenli eşdeğeri - gora-aldre? İle değiştirilmesi) ve ardından gerektiği gibi ince ayar yapılabilir.

Güvenli olmayan karakterlerin değiştirilmesi (her zaman) geri dönüşümlü olmadığından, bu tür şeyleri anında yapmak tamamen mümkün değildir.

Alternatif olarak, URL'yi bu şekilde oluşturursunuz:

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

Güvenli olmayan karakterlerin gerektiği gibi değiştirilmesiyle anında safe-string oluşturulduğu yer. 1234 numarası ürün anahtarıdır. Ürünü aramak için anahtarı kullanırsınız, 'güvenli dizge' kullanıcı ve arama motorları için daha fazladır.

1
Kris

Akılda tutulması gereken iki şey:

  1. URL yeniden yazma genellikle arama motorları üzerinde olumlu bir etkiye sahip değildir (ve genellikle olumsuz olanı da) - bu nedenle, yalnızca kullanıcı memnuniyeti üzerinde ölçülebilir bir pozitif etki olduğunu biliyorsanız (ve buna göre: URL’lerinizi kullanıcılar için yararlı kılar) .

  2. URL yeniden yazma yapmaya karar verirseniz, teknik detaylarınızı mükemmel bir şekilde öğrenmelisiniz . Örneğin, aynı içeriği gösteren hiçbir zaman birden fazla benzersiz URL'niz olmamalıdır. ASCII olmayan içeriğin kodlanması için UTF-8 kullandığınızdan, içeriğinizdeki kaçan bağlantıları kullandığınızdan ve genellikle planlanan şekilde çalıştığından emin olmak için çeşitli tarayıcıları test ettiğinizden emin olun. Bunlardan herhangi biri size yabancıysa, şu an için URL'yi yeniden yazmamanızı şiddetle tavsiye ederim.

FWIW Arama motoru yan sorunlarından bazıları http://googlewebmastercentral.blogspot.com/2008/09/dynamic-urls-vs-static-urls.html adresinde ele alınmıştır.

1
John Mueller

IMO'nun en iyi yöntemi, geçersiz karakterler aramaya çalışmak yerine beyaz liste karakterleri kullanmaktır. Ancak, é gibi aksanlı karakterler oldukça yaygındır (ve URL’niz onlarsız tuhaf olacaktır), böylece ilk önce bunları dönüştürebilirsiniz.

PHP içinde strtr işlevini kullanabilirsiniz, ancak asp.net'deki ihtiyaçlarınız için bunu değiştirebilmelisiniz:

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

Şimdi işte işleminiz:

  1. [isteğe bağlı] Dizeyi küçük harfe dönüştürün (genellikle URL'ler için önerilir).
  2. [isteğe bağlı] Yukarıdaki eşleştirmeyi kullanarak aksanlı karakterleri dönüştürün.
  3. Giriş dizginizi karakter karakter olarak çalıştırın.
  4. Hangi yerleşik fonksiyonlara sahip olduğunuza bağlı olarak, karakterin tamamında karakter başına # 1 ve # 2 yapmak daha hızlı olabilir.
  5. Karakter a-z veya -9 aralığındaysa, yeni dizenize ekleyin, aksi halde:
    a) Yeni dizenizin ucunda zaten bir kısa çizgi varsa, yok sayın
    b) Değilse, dizenin sonuna bir kısa çizgi ekleyin.
  6. Sona ulaştığınızda, tire ve iz süren tire veya sonra gelen bitirdiniz!
1
DisgruntledGoat

Gönderdiğiniz ASP.Net etiketli olduğundan: bu siteye bakın , (çoğu) metnin yerine diacritics (onları çağırdığınız geçersiz karakterler) karakterlerini temel karakterleriyle değiştirmek için örnek kod içerir.

Kris'in dediği gibi, bu sitenin yaptığı gibi, URL'nizde benzersiz bir kimlik kullanın. Size verilen kimliği kontrol edemiyorsanız, harici kimliği ile birlikte benzersiz kimliğinizi içeren bir çeviri tablosu oluşturmalısınız. Bu şekilde, dahili ID'niz değiştiğinde dahili referanslarınız da iyidir. Eşsiz kimliğinizle birlikte, çok benzersiz olmayan, ancak iyi görünen "Arama ve İnsan için optimize edilmiş kimliğinizi" kaydedersiniz.

0
GvS

Wikipedia genellikle latin1 olmayan karakterleri URL'lerinde kullanır. Bu URL'leri kullanmamanız için hiçbir neden yoktur (web sunucunuzun ötesinde onları desteklemiyorsanız).

Ancak; Eğer bu karakterlerden kaçınmanız gerekiyorsa, onları onların yerine - diacritic formları ile değiştirdim Bunları okuyan çoğu insan, diakritikler kaldırılsa bile, Kelimenin ne olması gerektiğini (bağlamdan) söyleyebilir.

0
Greg B