2009-04-03 10 views
4

Je me demandais quel est le meilleur moyen de transformer une chaîne (par exemple un titre de poste) en une URL descriptive. la façon la plus simple qui vient à l'esprit est à l'aide d'une expression régulière, comme dans:meilleure façon de transformer un titre de poste en une URL dans C#

public static Regex regex = new Regex(
     "\\W+", 
    RegexOptions.IgnoreCase 
    | RegexOptions.CultureInvariant 
    | RegexOptions.IgnorePatternWhitespace 
    | RegexOptions.Compiled 
    ); 

string result = regex.Replace(InputText,"_"); 

qui se

« mon premier (mais pas si mauvais) petit gâteau !! :) .// \. »

dans

my_first_yet_not_so_bad_cupcake_ 

alors je peux dépouiller le dernier « _ » et vérifiez contre ma db et voir si elle est encore présente. dans ce cas, j'ajouterais un numéro de fin pour le rendre unique et revérifier.

je pourrais l'utiliser, dire

http://myblogsite.xom/posts/my_first_yet_not_so_bad_cupcake 

mais, est ainsi en toute sécurité? devrais-je vérifier d'autres choses (comme la longueur de la chaîne) Y at-il une autre, meilleure méthode que vous préférez? merci

+0

Je voudrais utiliser des tirets au lieu de traits de soulignement. Mais c'est juste moi. –

+0

Je suis d'accord avec le commentaire tirets-vs-underscores - comme, apparemment, ne stackoverflow;) http://stackoverflow.com/questions/714653/best-way-to-turn-a-post-title-into-an -url-en-c – ojrac

+0

peut-être que les tirets sont moins intrusifs que les traits de soulignement, oui, cela pourrait être mieux. – pomarc

Répondre

2

Voici ce que je fais. regStripNonAlpha supprime tous les caractères non-alpha ou "-". Trim() supprime les espaces de début et de fin (donc nous ne finissons pas avec des tirets de chaque côté). regSpaceToDash convertit des espaces (ou des suites d'espaces) en un seul tiret. Cela a bien fonctionné pour moi.

static Regex regStripNonAlpha = new Regex(@"[^\w\s\-]+", RegexOptions.Compiled); 
static Regex regSpaceToDash = new Regex(@"[\s]+", RegexOptions.Compiled); 

public static string MakeUrlCompatible(string title) 
{ 
    return regSpaceToDash.Replace(
     regStripNonAlpha.Replace(title, string.Empty).Trim(), "-"); 
} 
1

chaîne résultat = regex.Replace (InputText, "-");

au lieu de sous-score mis hypen (-) qui donnerait un avantage supplémentaire pour le moteur de recherche Google.

Voir ci-dessous pour plus de détails après

http://www.mattcutts.com/blog/dashes-vs-underscores/

+0

Que signifient les traits d'union au lieu de traits de soulignement pour Google? – Joey

+0

Apparemment, ce problème a existé, mais a été neutralisé en 2007. Une recherche pour "google url underscore trait d'union" a donné lieu à ce post: http://www.seroundtable.com/archives/014260.html –

+0

http: //www.mattcutts. com/blog/dashes-vs-underscores/ – Kthevar

0

Vous pouvez regarder dans une réécriture URL HttpModule. Il y a beaucoup d'exemples sur le net.

Une fois mis en œuvre dans votre web.config que vous spécifiez simplement l'expression régulière à la carte à la page « réelle » en utilisant le nom convivial SEO

<!-- Rule 1: example... "/admin/somepage" redirects to..."/UI/Forms/Admin/frmPage.aspx" --> 

    <add key="^/admin/(.*)" value="/UI/Forms/Admin/frm$1.aspx" /> 
+0

bien, en utilisant un urlrewriting est juste une partie de l'image plus grande ... J'ai besoin d'un titre "urlified" pour le donner à urlrewrite, en effet. – pomarc

1

Voici une méthode que j'ai écrite il n'y a pas si longtemps qui prend une chaîne et la formate en un permalien.

 private string FormatPermalink(string title) 
     { 
      StringBuilder result = new StringBuilder(); 
      title = title.Trim(); 
      bool lastOneChanged = false; 
      for (int i = 0; i < title.Length; i++) 
      { 
       char c = title[i]; 
       if (!char.IsLetterOrDigit(c)) 
       { 
        c = '_'; 
        if (lastOneChanged) 
        { 
         continue; 
        } 
        lastOneChanged = true; 
       } 

       else 
       { 
        lastOneChanged = false; 
       } 

       result.Append(c); 
      } 

      if (result[result.Length - 1] == '_') //if last one is underscore, remove 
      { 
       result = result.Remove(result.Length - 1, 1); 
      } 
      return result.ToString(); 
     } 

Cela prend en compte les caractères spéciaux, donc si le titre a un caractère spécial, il ne tient pas compte juste et passe à la suivante.

+0

bon, mais je me demande: quand le résultat de ce serait différent (ou être meilleur) de la solution regex? – pomarc

0

Si vous voulez éviter de le faire vous-même, un module Http comme http://urlrewriter.net/ pourrait vous aider. C'est plutôt bien mais cela demande un peu de mise en place.

0

Personnellement, je couple de votre caractère spécial avec la suppression d'une date afin que votre exemple ressemblerait à ceci:

http://myblogsite.xom/posts/2009/04/03/my_first_yet_not_so_bad_cupcake

De cette façon, si vous contentez avec le même titre, il devient différencié par date trop .Je vois cela souvent sur certains blogs que je visite, où ils utilisent beaucoup "Five Random Things Make A Post" (mais pas dans le même jour).

+0

ce serait super cool s'il est fait comme un système d'URL navigable, où http: //myblogsite.xom/posts/2009/04/03 vous donnerait tous les messages d'aujourd'hui, http: //myblogsite.xom/ messages/2009/04 tous les postes d'avril et ainsi de suite. – pomarc

Questions connexes