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"
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)"
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"
Vous pouvez faire presque la même chose sans Rails:
text.gsub(/^(.{50,}?).*$/m,'\1...')
50
est la longueur dont vous avez besoin.
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..."
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.
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.
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")
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.