次のように文字列を切り捨てます。
入力:
string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"
出力:
string = "abcd asfsa sadfsaf safsdaf aa...ddddd"
truncate を見てください。部分的には望んでいます。切り捨てられたかどうかをテストする場合、切り捨てられた部分の後に最後の部分を追加することができます。
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)"
最も単純な場合:
string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"
tr_string = string[0, 20] + "..." + string[-5,5]
または
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"
almost Railsなしでも同じことができます:
text.gsub(/^(.{50,}?).*$/m,'\1...')
50
は必要な長さです。
これはあなたの問題の正確な解決策ではないかもしれませんが、正しい方向に導くのに役立つと思います。
「Hello、World!」が必要な場合最初の5文字に制限するには、次のようにします。
str = "Hello, World!"
str[0...5] # => "Hello"
楕円が必要な場合は、補間するだけです。
"#{str[0...5]}..." #=> "Hello..."
他の人がここで提案したことと同様に、Railsの #truncate メソッドを使用し、実際に文字列の最後の部分であるカスタム省略を使用できます。
string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"
truncate(string, length: 37, omission: "...#{string[-5, 5]}")
# => "abcd asfsa sadfsaf safsdaf aa...ddddd"
まさにあなたが望んだもの。
あなたはこれをtruncate_middle
のようなカスタムメソッドでラップして、いくつかの素晴らしいフットワークを行うことができます:
# 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
そして、次のように呼び出します:
string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"
truncate_middle( string, length: 37 )
# => "abcd asfsa sadfsaf safsdaf aa...ddddd"
ブーム!
これについてお問い合わせいただきありがとうございます。長いテキストの断片を表示するのに便利な方法だと思います。
これは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
だから、あなたの場合は
string.truncate(37, :omission => "...ddddd")
これは実際に興味深い問題であり、Rubyではなくjavascriptを使用して解決することができます。その理由は、おそらくこのテキストを画面のどこかに表示していて、ある程度の幅しか使用できないからです。したがって、リンク(または任意のテキスト)をいくつかの文字に削減するのではなく、表示するテキストが特定の幅を超えないようにすることが本当に必要です。特定の幅に収まる文字数は、使用しているフォント、間隔など(CSSスタイル)によって異なります。 Rubyベースのソリューションを使用している場合は、すべてが正常であることを確認できますが、後でスタイルを変更することにした場合、すべてが失敗する可能性があります。
そのため、JavaScriptベースのソリューションをお勧めします。以前にそれを処理した方法は、 jquery truncate plugin を使用することでした。プラグインをアプリに含めます。そして、ページがロードされるたびに、次のようなjavascriptをフックします。
function truncateLongText() {
$('.my_style1').truncate({
width: 270,
addtitle: true
});
$('.my_style2').truncate({
width: 100
});
}
切り捨て可能にする必要がある他のスタイルとそれらが尊重する幅を追加し、残りはプラグインが行います。これには、アプリ全体のすべての切り捨てロジックを1か所にまとめておくと便利な追加の利点があります。