2009-01-21 5 views
17

Prenez une chaîne telle que:Comment puis-je créer une URL délimitée par des liens entre les moteurs de recherche dans une chaîne?

En C#: Comment puis-je ajouter « Citations » autour de la chaîne dans une liste délimitée par des virgules des chaînes?

et le convertir en:

en c-faire-do-i-add-citations autour-string-in-a-délimité par des virgules liste de chaînes comme

Exigences:

  • Séparez chaque mot par un tiret et enlever toute la ponctuation
  • (en prenant en compte tous les mots sont séparés par des espaces.)
  • La fonction prend une longueur maximale et obtient tous les jetons en dessous de cette longueur maximale. Exemple: ToSeoFriendly("hello world hello world", 14) renvoie "hello-world"
  • Tous les mots sont convertis en minuscules.

Sur une note distincte, devrait-il y avoir une longueur minimale?

+1

quelques informations ici sur url longueur: http: //www.boutell.com/newfaq/misc/urllength.html – bchhun

+1

Peut-être remplacer certains caractères spéciaux par leur "prononciation anglaise", par ex. "#" => "sharp", permettrait de faire de meilleures URL et de différencier C de C# (ce qui est bon, à droite;)?)? – Wookai

+0

oui certainement, sauf # n'est pas net, c'est un symbole différent; p – Shawn

Répondre

10

Voici mon solution en C#

private string ToSeoFriendly(string title, int maxLength) { 
    var match = Regex.Match(title.ToLower(), "[\\w]+"); 
    StringBuilder result = new StringBuilder(""); 
    bool maxLengthHit = false; 
    while (match.Success && !maxLengthHit) { 
     if (result.Length + match.Value.Length <= maxLength) { 
      result.Append(match.Value + "-"); 
     } else { 
      maxLengthHit = true; 
      // Handle a situation where there is only one word and it is greater than the max length. 
      if (result.Length == 0) result.Append(match.Value.Substring(0, maxLength)); 
     } 
     match = match.NextMatch(); 
    } 
    // Remove trailing '-' 
    if (result[result.Length - 1] == '-') result.Remove(result.Length - 1, 1); 
    return result.ToString(); 
} 
2

Voici une solution pour php:

function make_uri($input, $max_length) { 
    if (function_exists('iconv')) { 
    $input = @iconv('UTF-8', 'ASCII//TRANSLIT', $input); 
    } 

    $lower = strtolower($input); 


    $without_special = preg_replace_all('/[^a-z0-9 ]/', '', $input); 
    $tokens = preg_split('/ +/', $without_special); 

    $result = ''; 

    for ($tokens as $token) { 
    if (strlen($result.'-'.$token) > $max_length+1) { 
     break; 
    } 

    $result .= '-'.$token;  
    } 

    return substr($result, 1); 
} 

utilisation:

echo make_uri('In C#: How do I add "Quotes" around string in a ...', 500); 

À moins que vous avez besoin uri être typable, ils ne doivent pas nécessairement être petit. Mais vous devez spécifier un maximum pour que les urls fonctionnent bien avec les proxies, etc.

7

Je procédez comme suit:

  1. chaîne de conversion en minuscules
  2. remplacer les caractères indésirables par des traits d'union
  3. remplacer plusieurs traits d'union par un trait d'union(pas nécessaire que l'appel de fonction preg_replace() déjà empêche les traits d'union multiples)
  4. supprimer les hypens au début et à la fin si nécessaire
  5. garniture si nécessaire à partir du dernier trait d'union avant la position x à la fin

Ainsi, tous ensemble dans une fonction (PHP):

function generateUrlSlug($string, $maxlen=0) 
{ 
    $string = trim(preg_replace('/[^a-z0-9]+/', '-', strtolower($string)), '-'); 
    if ($maxlen && strlen($string) > $maxlen) { 
     $string = substr($string, 0, $maxlen); 
     $pos = strrpos($string, '-'); 
     if ($pos > 0) { 
      $string = substr($string, 0, $pos); 
     } 
    } 
    return $string; 
} 
+0

J'aime cette solution. J'essayais de le faire en faisant correspondre tous les non-alphanumériques et en les séparant - je n'arrêtais pas de faire correspondre seulement s'ils n'étaient pas le début ou la fin de la chaîne, mais je ne l'ai jamais fait fonctionner. À la fin, je me suis contenté de faire correspondre les mots et de les ajouter. – Shawn

+0

Que faire si le premier mot est plus long que la longueur maximale? – Wookai

+0

j'ai retourné une sous-chaîne dans cette situation – Shawn

4

C#

public string toFriendly(string subject) 
{ 
    subject = subject.Trim().ToLower(); 
    subject = Regex.Replace(subject, @"\s+", "-"); 
    subject = Regex.Replace(subject, @"[^A-Za-z0-9_-]", ""); 
    return subject; 
} 
+0

je pense que cela a quelques problèmes parce que sur cette situation: (chaîne) someObject échoue. devient: stringsomeobject-échoue – Shawn

+1

qui est venu à moi, mais franchement je ne sais pas comment je voudrais le gérer. Dans le passé, je suis allé nuoter tout ce qui était entre et y compris les parens, mais je suppose que c'est spécifique à la mise en œuvre. Quoi que vous vouliez, il est trivial d'ajouter au modèle ci-dessus. – annakata

0

Une façon légèrement plus propre de faire t son en PHP est au moins:

function CleanForUrl($urlPart, $maxLength = null) { 
    $url = strtolower(preg_replace(array('/[^a-z0-9\- ]/i', '/[ \-]+/'), array('', '-'), trim($urlPart))); 
    if ($maxLength) $url = substr($url, 0, $maxLength); 
    return $url; 
} 

pourrait tout aussi bien faire l'trim() au début donc il y a moins de traiter plus tard et le remplacement complet se fait avec la preg_replace().

Thxs à cg pour venir avec la plupart de ceci: What is the best way to clean a string for placement in a URL, like the question name on SO?

2

Une meilleure version:

function Slugify($string) 
{ 
    return strtolower(trim(preg_replace(array('~[^0-9a-z]~i', '~-+~'), '-', $string), '-')); 
} 
0

Dans une URL dynamique, ces identifiants sont passés via la chaîne de requête à un script qui .. . comme le caractère de délimitation parce que la plupart des moteurs de recherche traitent le tableau de bord comme ... NET: un Guide du développeur de SEO couvre également ces trois méthodes supplémentaires search engine optimization

1

Solution en Perl:

my $input = 'In C#: How do I add "Quotes" around string in a comma delimited list of strings?'; 

my $length = 20; 
$input =~ s/[^a-z0-9]+/-/gi; 
$input =~ s/^(.{1,$length}).*/\L$1/; 

print "$input\n"; 

fait.

1

Solution shell:

echo 'In C#: How do I add "Quotes" around string in a comma delimited list of strings?' | \ 
    tr A-Z a-z | \ 
    sed 's/[^a-z0-9]\+/-/g;s/^\(.\{1,20\}\).*/\1/' 
0

Une autre saison, une autre raison, d'avoir choisi Ruby :)

def seo_friendly(str) 
    str.strip.downcase.gsub /\W+/, '-' 
end 

C'est tout.

+0

que diriez-vous dasherize :) –

+0

C'est pour Rails, pas pour la vanille Ruby. – edgerunner

0

En python, (si django est installé, même si vous utilisez un autre cadre.)

from django.template.defaultfilters import slugify 
slugify("In C#: How do I add "Quotes" around string in a comma delimited list of strings?") 
1

C'est proche de la façon dont le débordement de pile génère les limaces:

public static string GenerateSlug(string title) 
{ 
    string slug = title.ToLower(); 
    if (slug.Length > 81) 
     slug = slug.Substring(0, 81); 
    slug = Regex.Replace(slug, @"[^a-z0-9\-_\./\\ ]+", ""); 
    slug = Regex.Replace(slug, @"[^a-z0-9]+", "-"); 

    if (slug[slug.Length - 1] == '-') 
     slug = slug.Remove(slug.Length - 1, 1); 
    return slug; 
} 
Questions connexes