it-swarm-eu.dev

Jak odstraníte neplatné znaky při vytváření přátelské adresy URL (tj. Jak vytvoříte slug)?

Řekněme, že mám tuto webovou stránku: http://ww.xyz.com/Product.aspx?CategoryId=1

Pokud je název kategorieId = 1 „Psi“, chtěl bych převést adresu URL na něco podobného: http://ww.xyz.com/Products/Dogs

Problém je, pokud název kategorie obsahuje cizí (nebo neplatné pro url) znaky. Pokud je název kategorieId = 2 „Göra äldre“, jaká by měla být nová adresa URL?

Logicky by to mělo být: http://ww.xyz.com/Products/Göra äldre, ale nebude to fungovat.

Za prvé kvůli prostoru (který mohu snadno nahradit například pomlčkou), ale co cizí postavy? V Asp.net bych mohl použít funkci URLEncode, která by poskytla něco podobného: http://ww.xyz.com/Products/G%c3%b6ra+%c3%a4ldre, ale nemohu říci, že je lepší než původní URL (http://ww.xyz.com/Product.aspx?CategoryId=2).

V ideálním případě bych to chtěl vygenerovat, ale jak to mohu udělat automaticky (tj. Převést cizí znaky na 'bezpečné' znaky URL): http://ww.xyz.com/Products/Gora-aldre.

6
Anthony

Přišel jsem s těmito dvěma způsoby rozšíření (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

Závisí to na jazyce, který používáte, a na technice, kterou chcete použít. Podívejte se na tento úryvek JavaScriptu ze zdroje Django, dělá přesně to, co potřebujete. Můžete jej snadno přenést do jazyka dle vašeho výběru.

Toto je úryvek Python používaný ve funkci Django slugify, je to mnohem kratší:

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)

Myslím, že každý jazyk dostal port, protože je to běžný problém. Jen Google pro slugify + váš jazyk.

2
D4V360

Do tabulky Produkty můžete přidat nové pole, které obsahuje bezpečný a jedinečný název URL pro každý produkt. Pravděpodobně by to mohlo být automaticky vygenerováno zpočátku (nahrazením nezabezpečených znaků nejbezpečnějším ekvivalentem - gora-aldre?) A poté podle potřeby jemně doladěn.

Vzhledem k tomu, že nahrazení nezabezpečených znaků není (vždy) reverzibilní, není zcela možné provádět tento druh věcí za běhu.

Adresu URL můžete také sestavit takto:

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

Tam, kde je vytvořeno safe-string, se nahradí nebezpečné znaky podle potřeby. Číslo 1234 je kód Product Key. Pomocí klíče vyhledáte produkt, „bezpečný řetězec“ je více pro uživatele a vyhledávače.

1
Kris

Nezapomeňte na dvě věci:

  1. Přepisování URL obecně nemá pozitivní účinek na vyhledávače (a často negativní) - měli byste to dělat pouze tehdy, pokud víte o měřitelném pozitivním účinku na spokojenost uživatelů (a podle toho: učinte své adresy URL užitečné pro uživatele) .

  2. Pokud se rozhodnete přepisovat URL, musíte mít technické podrobnosti dokonale. Například byste nikdy neměli mít více než jednu jedinečnou adresu URL zobrazující stejný obsah. Ujistěte se, že používáte UTF-8 pro kódování obsahu, který není ASCII, použijte únikové odkazy v obsahu a obecně testujte v různých prohlížečích, abyste se ujistili, že věci fungují podle plánu. Pokud je pro vás něco z toho cizí, důrazně doporučujeme prozatím nedělat přepisování URL.

FWIW Některé problémy na straně vyhledávače jsou uvedeny na http://googlewebmastercentral.blogspot.com/2008/09/dynamic-urls-vs-static-urls.html

1
John Mueller

Nejlepší metoda IMO je whitelist znaků, spíše než se pokoušet hledat neplatné znaky. Znaky s diakritikou jako é jsou však poměrně běžné (a vaše URL bude bez nich liché), takže je můžete převést jako první.

Ve funkci PHP můžete použít funkci strtr, ale měli byste být schopni to upravit podle svých potřeb na asp.net:

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

Tady je váš proces:

  1. [nepovinné] Převeďte řetězec na malá písmena (obvykle se doporučuje pro adresy URL).
  2. [volitelné] Převeďte zvýrazněné znaky pomocí výše uvedeného mapování.
  3. Proveďte vstupní řetězec znak po znaku.
  4. V závislosti na tom, jaké vestavěné funkce máte, může být rychlejší provádět # 1 a # 2 na znak namísto celého řetězce.
  5. Pokud je znak v rozsahu a-z nebo -9, přidejte jej do nového řetězce, jinak:
    a) Pokud již máte na konci nového řetězce spojovník, ignorujte jej
    b) Pokud ne, přidejte na konec řetězce spojovník.
  6. Až dorazíte na konec, odstraňte a vedoucí nebo koncové spojovníky a máte hotovo!
1
DisgruntledGoat

Protože příspěvek je označen ASP.Net: podívejte se na tento web , obsahuje ukázkový kód k nahrazení (většiny) textu s diakritikou (neplatné znaky, kterým je nazýváte) jejich základním znakem.

Jak Kris uvedl, ve své adrese URL používejte jedinečné ID, stejně jako tento web. Pokud nemáte žádnou kontrolu nad ID, která vám byla poskytnuta, měli byste vytvořit překladovou tabulku, která obsahuje vaše jedinečné ID, s externími jedinečnými ID. Tímto způsobem jsou vaše interní reference také dobré, když se změní externí ID. Spolu s vaším jedinečným ID uložíte své „ID optimalizované pro vyhledávání a člověka“, které není tak jedinečné, ale vypadá dobře.

0
GvS

Wikipedia ve svých adresách URL často používají znaky jiné než latin1. Neexistuje žádný důvod (kromě toho, že váš webový server nepodporuje), že byste tyto adresy URL neměli používat.

Nicméně; Pokud se musíte těmto znakům vyhnout, zjistil jsem, že je nahradí jejich ne diacritic . Většina lidí, kteří si je přečtou, může říct (z kontextu), co má být Slovo, i když byla odebrána diakritiky.

0
Greg B