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
.
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;
}
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.
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
Où 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.
Deux choses à garder à l'esprit:
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). .
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
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:
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.
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.