web-dev-qa-db-fra.com

Comment supprimer les caractères non valides lors de la création d'une URL conviviale (c.-à-d. Comment créer un slug)?

Dites que j'ai cette page Web: http://ww.xyz.com/Product.aspx?CategoryId=1

Si le nom de CategoryId = 1 est "Dogs", j'aimerais convertir l'URL en quelque chose comme ceci: http://ww.xyz.com/Products/Dogs

Le problème est que le nom de la catégorie contient des caractères étrangers (ou non valides pour une URL). Si le nom de CategoryId = 2 est "Göra äldre", quelle devrait être la nouvelle URL?

Logiquement, cela devrait être: http://ww.xyz.com/Products/Göra äldre mais cela ne fonctionnera pas.

D'abord à cause de l'espace (que je peux facilement remplacer par un tiret par exemple), mais qu'en est-il des caractères étrangers? Dans Asp.net, je pourrais utiliser la fonction URLEncode qui donnerait quelque chose comme ceci: http://ww.xyz.com/Products/G%c3%b6ra+%c3%a4ldre mais je ne peux pas vraiment dire que c'est mieux que l'URL d'origine (http://ww.xyz.com/Product.aspx?CategoryId=2).

Idéalement, j'aimerais générer celui-ci, mais comment puis-je le faire automatiquement (c.-à-d. Convertir les caractères étrangers en caractères URL "sûrs"): http://ww.xyz.com/Products/Gora-aldre.

6
Anthony

J'ai mis au point les 2 méthodes d'extension suivantes (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

Cela dépend de la langue que vous utilisez et de la technique que vous souhaitez utiliser. Jetez un coup d'oeil à cet extrait de JavaScript de la source Django, il fait exactement ce dont vous avez besoin. Vous pouvez facilement le porter dans la langue de votre choix, je suppose.

C'est l'extrait Python utilisé dans la fonction Django slugify, il est beaucoup plus court:

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)

Je pense que chaque langue en a un portage, car c'est un problème commun. Juste Google pour slugify + votre langue.

2
D4V360

Vous pouvez ajouter à la table Produits un nouveau champ contenant un nom unique et sécurisé pour l'URL de chaque produit. Cela pourrait probablement être généré automatiquement initialement (en remplaçant les caractères non sécurisés par l'équivalent sûr le plus proche - gora-aldre?) Puis ajusté au besoin.

Étant donné que le remplacement de caractères non sécurisés n'est pas (toujours) réversible, il n'est pas tout à fait possible de faire ce genre de chose à la volée.

Alternativement, vous construisez l'URL comme suit:

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

safe-string est créé à la volée en remplaçant les caractères non sécurisés selon les besoins. Le nombre 1234 est la clé de produit. Vous utilisez la clé pour rechercher le produit, la 'chaîne sécurisée' existe davantage pour l'utilisateur et les moteurs de recherche.

1
Kris

Deux choses à garder à l'esprit:

  1. La réécriture d'URL n'a généralement pas d'effet positif sur les moteurs de recherche (et souvent négatif) - vous ne devez donc le faire que si vous connaissez un effet positif mesurable sur la satisfaction de l'utilisateur (et donc: rendez vos URL utiles pour les utilisateurs). .

  2. Si vous décidez de faire une réécriture d'URL, vous devez maîtriser parfaitement les détails techniques. Par exemple, vous ne devriez jamais avoir plus d'une URL unique montrant le même contenu. Assurez-vous que vous utilisez UTF-8 pour le codage du contenu non-ASCII, que vous utilisez des liens masqués dans votre contenu et que vous testez généralement sur différents navigateurs pour vous assurer que tout fonctionne comme prévu. Si cela vous est étranger, je vous recommande fortement de ne pas réécrire d'URL pour le moment.

FWIW Certains problèmes liés aux moteurs de recherche sont abordés à l’adresse http://googlewebmastercentral.blogspot.com/2008/09/dynamic-urls-vs-static-urls.html

1
John Mueller

La meilleure méthode à laquelle IMO s'adresse est de liste blanche caractères plutôt que d'essayer de rechercher des caractères non valides. Cependant, les caractères accentués comme é sont assez courants (et votre URL sera étrange sans eux), vous pouvez donc les convertir en premier.

Dans PHP, vous pouvez utiliser la fonction strtr, mais vous devriez pouvoir le modifier pour vos besoins sur asp.net:

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

Maintenant, voici votre processus:

  1. [facultatif] Convertissez la chaîne en minuscule (généralement recommandée pour les URL).
  2. [facultatif] Convertissez les caractères accentués à l'aide du mappage ci-dessus.
  3. Parcourez votre chaîne d’entrée caractère par caractère.
  4. Il sera peut-être plus rapide de faire les caractères n ° 1 et n ° 2 par caractère plutôt que sur la chaîne entière, en fonction des fonctions intégrées dont vous disposez.
  5. Si le caractère est dans la plage a-z ou -9, ajoutez-le à votre nouvelle chaîne, sinon:
    a) Si vous avez déjà un trait d'union à la fin de votre nouvelle chaîne, ignorez-le.
    b) Sinon, ajoutez un trait d'union à la fin de la chaîne.
  6. Lorsque vous arrivez à la fin, supprimez et tirez les traits d'union et vous avez terminé!
1
DisgruntledGoat

Puisque vous postez est étiqueté ASP.Net: regardez ce site , il contient un exemple de code pour remplacer (la plupart) le texte par des signes diacritiques (caractères non valides appelés par vous) par leur caractère de base.

Comme Kris l’a mentionné, utilisez un identifiant unique dans votre URL, comme le fait ce site. Si vous n'avez aucun contrôle sur les identifiants qui vous ont été fournis, vous devez créer une table de traduction contenant votre identifiant unique, avec les identifiants uniques externes. Ainsi, vos références internes sont également utiles lorsque les identifiants externes changent. En même temps que votre ID unique, vous stockez votre "ID optimisé pour la recherche et l'homme", celui qui n'est pas si unique, mais qui a belle apparence.

0
GvS

Wikipedia utilise souvent des caractères non-latin1 dans leurs URL. Il n'y a aucune raison (à part votre serveur Web ne les prenant pas en charge) de ne pas utiliser ces URL.

Toutefois; Si vous devez éviter ces caractères, j'ai trouvé que les remplacer par leur forme non - diacritique . La plupart des gens qui les lisent peuvent dire (à partir du contexte) ce que la Parole est supposée être même si les signes diacritiques ont été supprimés.

0
Greg B