web-dev-qa-db-fra.com

Tronquer la chaîne avec Rails?

Je veux tronquer une chaîne comme suit:

entrée:

string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"

sortie:

string = "abcd asfsa sadfsaf safsdaf aa...ddddd"
53
krunal shah

Jetez un oeil à tronquer , il veut partiellement ce que vous voulez. Si vous testez si elle a été tronquée ou non, vous pouvez ajouter une partie de la dernière partie après la partie tronquée.

truncate("Once upon a time in a world far far away")
# => "Once upon a time in a world..."

truncate("Once upon a time in a world far far away", :length => 17)
# => "Once upon a ti..."

truncate("Once upon a time in a world far far away", :length => 17, :separator => ' ')
# => "Once upon a..."

truncate("And they found that many people were sleeping better.", :length => 25, :omission => '... (continued)')
# => "And they f... (continued)"
93
Veger

Dans le cas le plus simple:

string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"
tr_string = string[0, 20] + "..." + string[-5,5]

ou

def trancate(string, length = 20)
  string.size > length+5 ? [string[0,length],string[-5,5]].join("...") : string
end

# Usage
trancate "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"
#=> "abcd asfsa sadfsaf s...ddddd"
trancate "Hello Beautiful World"
#=> "Hello Beautiful World"
trancate "Hello Beautiful World", 5
#=> "Hello...World"
14
fl00r

Vous pouvez faire presque la même chose sans Rails:

text.gsub(/^(.{50,}?).*$/m,'\1...')

50 est la longueur dont vous avez besoin.

13
yegor256

Ce n'est peut-être pas la solution exacte à votre problème, mais je pense que cela vous aidera à vous mettre dans la bonne direction, avec une façon assez propre de faire les choses.

Si vous voulez "Bonjour tout le monde!" pour être limité aux cinq premières lettres, vous pouvez faire:

str = "Hello, World!"
str[0...5] # => "Hello"

Si vous voulez des ellipses, interpolez-les simplement:

"#{str[0...5]}..." #=> "Hello..."
9
elli0t

Tronquer avec une omission personnalisée

Semblable à ce que d'autres ont suggéré ici, vous pouvez utiliser la méthode # truncate de Rails et utiliser une omission personnalisée qui est en fait la dernière partie de votre chaîne:

string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"

truncate(string, length: 37, omission: "...#{string[-5, 5]}")
# => "abcd asfsa sadfsaf safsdaf aa...ddddd"

Exactement ce que vous vouliez.

Points bonus

Vous voudrez peut-être envelopper cela dans une méthode personnalisée appelée quelque chose comme truncate_middle qui vous propose de fantastiques jeux de jambes:

# Truncate the given string but show the last five characters at the end.
#
def truncate_middle( string, options = {} )
  options[:omission] = "...#{string[-5, 5]}"    # Use last 5 chars of string.

  truncate( string, options )
end

Et puis appelez-le comme ceci:

string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"

truncate_middle( string, length: 37 )
# => "abcd asfsa sadfsaf safsdaf aa...ddddd"

Boom!

Merci d'avoir posé cette question. Je pense que c'est un moyen utile de montrer un extrait d'un plus long morceau de texte.

8
Joshua Pinter

Ceci est le code source de String#truncate

def truncate(truncate_at, options = {})
  return dup unless length > truncate_at

  options[:omission] ||= '...'
  length_with_room_for_omission = truncate_at - options[:omission].length
  stop = \
    if options[:separator]
      rindex(options[:separator], length_with_room_for_omission) ||      length_with_room_for_omission
    else
      length_with_room_for_omission
    end

   "#{self[0...stop]}#{options[:omission]}"
end

Donc, comme pour vous

string.truncate(37, :omission => "...ddddd")
5
hiveer

C'est en fait un problème intéressant et vous voudrez peut-être le résoudre en utilisant javascript plutôt que Ruby. Voici pourquoi, vous affichez probablement ce texte à l'écran quelque part et vous n'avez qu'une certaine quantité de largeur disponible. Donc, plutôt que d'avoir votre lien (ou n'importe quel texte) réduit à un certain nombre de caractères, ce que vous voulez vraiment, c'est vous assurer que le texte que vous affichez ne dépasse jamais une certaine largeur. Le nombre de caractères pouvant tenir dans une certaine largeur dépend de la police, de l'espacement, etc. (les styles CSS) que vous utilisez. Vous pouvez vous assurer que tout va bien si vous utilisez une solution basée sur Ruby, mais cela pourrait tout tomber si vous décidez de changer votre style plus tard.

Je recommande donc une solution basée sur javascript. La façon dont je l'ai géré précédemment a été d'utiliser le plugin jquery truncate . Incluez le plugin dans votre application. Et puis connectez du javascript similaire à ce qui suit à chaque chargement de la page:

function truncateLongText() {
  $('.my_style1').truncate({
    width: 270,
    addtitle: true
  });
  $('.my_style2').truncate({
    width: 100
  });
}

Ajoutez tous les autres styles qui doivent être tronquables et la largeur qu'ils doivent respecter, le plugin fait le reste. Cela a l'avantage supplémentaire d'avoir toute votre logique de troncature pour l'ensemble de l'application en un seul endroit, ce qui peut être pratique.

3
skorks