it-swarm.com.de

Wie entfernst du ungültige Zeichen, wenn du eine freundliche URL erstellst (dh wie erstelle ich einen Slug)?

Angenommen, ich habe diese Webseite: http://ww.xyz.com/Product.aspx?CategoryId=1

Wenn der Name von CategoryId = 1 "Dogs" ist, möchte ich die URL in etwas Ähnliches umwandeln: http://ww.xyz.com/Products/Dogs

Das Problem ist, wenn der Kategoriename fremde (oder für eine URL ungültige) Zeichen enthält. Wenn der Name von CategoryId = 2 "Göra äldre" ist, wie sollte die neue URL lauten?

Logischerweise sollte es sein: http://ww.xyz.com/Products/Göra äldre aber es wird nicht funktionieren.

Erstens wegen des Leerzeichens (das ich zum Beispiel leicht durch einen Bindestrich ersetzen kann), aber was ist mit den fremden Zeichen? In Asp.net könnte ich die URLEncode-Funktion verwenden, die etwa Folgendes ergibt: http://ww.xyz.com/Products/G%c3%b6ra+%c3%a4ldre, aber ich kann nicht wirklich sagen, dass sie besser ist als die ursprüngliche URL (http://ww.xyz.com/Product.aspx?CategoryId=2).

Idealerweise möchte ich diesen generieren, aber wie kann ich das automatisch tun (dh Fremdzeichen in "sichere" URL-Zeichen konvertieren): http://ww.xyz.com/Products/Gora-aldre.

6
Anthony

Ich habe mir die 2 folgenden Erweiterungsmethoden ausgedacht (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

Dies hängt von der Sprache und der Technik ab, die Sie verwenden möchten. Schauen Sie sich dieses JavaScript-Snippet aus der Quelle Django an, es macht genau das, was Sie brauchen. Sie können es leicht auf die Sprache Ihrer Wahl portieren, denke ich.

Dies ist das Python Snippet, das in der Django Slugify-Funktion verwendet wird. Es ist viel kürzer:

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)

Ich denke, jede Sprache hat eine Portierung davon, da es ein weit verbreitetes Problem ist. Nur Google for Slugify + Ihre Sprache.

2
D4V360

Sie können der Tabelle "Produkte" ein neues Feld hinzufügen, das einen URL-sicheren und eindeutigen Namen für jedes Produkt enthält. Dies könnte wahrscheinlich zuerst automatisch generiert werden (wobei nicht sichere Zeichen durch das nächste sichere Äquivalent ersetzt werden - gora-aldre?) Und dann nach Bedarf feinabgestimmt werden.

Da das Ersetzen nicht sicherer Zeichen nicht (immer) rückgängig gemacht werden kann, ist es nicht ganz machbar, solche Aktionen im laufenden Betrieb durchzuführen.

Alternativ erstellen Sie die URL folgendermaßen:

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

Dabei wird safe-string im laufenden Betrieb erstellt, wobei unsichere Zeichen nach Bedarf ersetzt werden. Die Nummer 1234 ist der Produktschlüssel. Mit dem Schlüssel können Sie das Produkt nachschlagen, der Safe-String ist mehr für den Benutzer und die Suchmaschinen.

1
Kris

Zwei Dinge zu beachten:

  1. Das Umschreiben von URLs wirkt sich in der Regel nicht positiv auf Suchmaschinen aus (und häufig negativ). Sie sollten dies daher nur tun, wenn Sie messbare positive Auswirkungen auf die Benutzerzufriedenheit haben (und dementsprechend: Machen Sie Ihre URLs für die Benutzer nützlich). .

  2. Wenn Sie sich für das Umschreiben von URLs entscheiden, müssen Sie die technischen Details genau kennen . Beispielsweise sollten Sie niemals mehr als eine eindeutige URL haben, die denselben Inhalt anzeigt. Stellen Sie sicher, dass Sie UTF-8 für die Codierung von Nicht-ASCII-Inhalten verwenden, maskierte Links in Ihren Inhalten verwenden und im Allgemeinen in verschiedenen Browsern testen, um sicherzustellen, dass die Dinge wie geplant funktionieren. Wenn Ihnen irgendetwas davon fremd ist, würde ich dringend empfehlen, im Moment keine URL-Umschreibung durchzuführen.

FWIW Einige der suchmaschinenseitigen Probleme werden unter http://googlewebmastercentral.blogspot.com/2008/09/dynamic-urls-vs-static-urls.html behandelt

1
John Mueller

Die beste Methode IMO ist es, Whitelist Zeichen zu verwenden, anstatt nach ungültigen Zeichen zu suchen. Akzentuierte Zeichen wie é sind jedoch weit verbreitet (und Ihre URL wird ohne sie ungerade sein), sodass Sie diese zuerst konvertieren können.

In PHP können Sie die Funktion strtr verwenden, aber Sie sollten dies für Ihre Bedürfnisse auf asp.net ändern können:

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

Hier ist Ihr Prozess:

  1. [optional] Konvertieren Sie die Zeichenfolge in Kleinbuchstaben (normalerweise für URLs empfohlen).
  2. [optional] Konvertieren Sie die Zeichen mit Akzent mithilfe der obigen Zuordnung.
  3. Führen Sie Ihre Eingabezeichenfolge zeichenweise durch.
  4. Je nach den eingebauten Funktionen ist es möglicherweise schneller, die Zeichen 1 und 2 anstelle der gesamten Zeichenfolge auszuführen.
  5. Befindet sich das Zeichen im Bereich a-z oder -9, fügen Sie es Ihrer neuen Zeichenfolge hinzu. Andernfalls:
    a) Wenn Sie am Ende Ihrer neuen Zeichenfolge bereits einen Bindestrich haben, ignorieren Sie diesen
    b) Wenn nicht, fügen Sie am Ende der Zeichenfolge einen Bindestrich hinzu.
  6. Wenn Sie am Ende angekommen sind, entfernen Sie Bindestriche und führen Sie sie vor oder nach, und schon sind Sie fertig!
1
DisgruntledGoat

Da Ihr Beitrag mit ASP.Net getaggt ist: schauen Sie sich diese Site an , enthält er Beispielcode, um (den meisten) Text durch diakritische Zeichen (ungültige Zeichen, die Sie sie nennen) durch deren Basiszeichen zu ersetzen.

Wie Kris bereits erwähnt hat, benutze eine eindeutige ID in deiner URL, so wie es diese Seite tut. Wenn Sie keine Kontrolle über die bereitgestellten IDs haben, sollten Sie eine Übersetzungstabelle erstellen, die Ihre eindeutige ID mit den externen eindeutigen IDs enthält. Auf diese Weise sind Ihre internen Referenzen auch dann gut, wenn sich die externe ID ändert. Zusammen mit Ihrer eindeutigen ID speichern Sie Ihre "such- und benutzeroptimierte ID", die nicht so eindeutig ist, aber gut aussieht.

0
GvS

Wikipedia verwendet häufig nicht-lateinische Zeichen1 in ihren URLs. Es gibt keinen Grund (außer dass Ihr Webserver sie nicht unterstützt), diese URLs nicht zu verwenden.

Jedoch; Wenn Sie diese Zeichen vermeiden müssen, habe ich festgestellt, dass sie durch ihre nicht - diakritische Form ersetzt werden. Die meisten Leute, die diese lesen, können (aus dem Kontext) sagen, was das Wort sein soll, obwohl die diakritischen Zeichen entfernt wurden.

0
Greg B