Question

Prenez une chaîne telle que:

  

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

et le convertir en:

  

liste-de-chaînes-délimitée par des virgules in-c-how-do-i-add-quotes-around-string

Conditions requises:

  • Séparez chaque mot par un tiret et supprimez toute ponctuation (en tenant compte du fait que tous les mots ne sont pas séparés par des espaces.)
  • La fonction prend une longueur maximale et obtient tous les jetons inférieurs à cette longueur maximale. Exemple: ToSeoFriendly ("hello world hello world", 14) renvoie "hello-world"
  • Tous les mots sont convertis en minuscules.

Sur une note séparée, devrait-il y avoir une longueur minimale?

Était-ce utile?

La solution

Voici ma 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();
}

Autres conseils

Je voudrais suivre ces étapes:

  1. convertir la chaîne en minuscule
  2. remplacez les caractères non désirés par des tirets
  3. remplace plusieurs traits d'union par un trait d'union (inutile car la fonction preg_replace () empêche déjà plusieurs traits d'union)
  4. supprimer les hypens au début et à la fin si nécessaire
  5. coupez si nécessaire du dernier tiret avant la position x jusqu'à la fin

Donc, 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;
}

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;
}

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);

Sauf si vous avez besoin que les uris soient typables, ils n'ont pas besoin d'être petits. Mais vous devez spécifier un maximum pour que les URL fonctionnent bien avec les mandataires, etc.

Une meilleure version:

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

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";

terminé.

Solution en 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/'

Ceci est proche de la façon dont Stack Overflow génère des slugs:

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;
}

Une façon légèrement plus propre de faire cela 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;
}

Peut également faire le trim () au début pour qu'il en reste moins à traiter ultérieurement et que le remplacement complet soit effectué dans le preg_replace () .

Merci à cg pour avoir trouvé l'essentiel de ceci: Quel est le meilleur moyen de nettoyer une chaîne pour la placer dans une URL, comme le nom de la question sous SO?

Dans une URL dynamique, ces identifiants sont transmis via la chaîne de requête à un script qui ... en tant que caractère de délimitation, car la plupart des moteurs de recherche traitent le tiret comme ... NET: le Guide du développeur pour le référencement traite également de ces trois éléments. méthodes supplémentaires optimisation des moteurs de recherche

Une autre saison, une autre raison de choisir Ruby :)

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

C'est tout.

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

from django.template.defaultfilters import slugify
slugify("In C#: How do I add "Quotes" around string in a comma delimited list of strings?")
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top