web-dev-qa-db-ja.com

Railsで文字列を切り捨てますか?

次のように文字列を切り捨てます。

入力:

string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"

出力:

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

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)"
93
Veger

最も単純な場合:

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"
14
fl00r

almost Railsなしでも同じことができます:

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

50は必要な長さです。

13
yegor256

これはあなたの問題の正確な解決策ではないかもしれませんが、正しい方向に導くのに役立つと思います。

「Hello、World!」が必要な場合最初の5文字に制限するには、次のようにします。

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

楕円が必要な場合は、補間するだけです。

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

カスタム省略で切り捨て

他の人がここで提案したことと同様に、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"

ブーム!

これについてお問い合わせいただきありがとうございます。長いテキストの断片を表示するのに便利な方法だと思います。

8
Joshua Pinter

これは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")
5
hiveer

これは実際に興味深い問題であり、Rubyではなくjavascriptを使用して解決することができます。その理由は、おそらくこのテキストを画面のどこかに表示していて、ある程度の幅しか使用できないからです。したがって、リンク(または任意のテキスト)をいくつかの文字に削減するのではなく、表示するテキストが特定の幅を超えないようにすることが本当に必要です。特定の幅に収まる文字数は、使用しているフォント、間隔など(CSSスタイル)によって異なります。 Rubyベースのソリューションを使用している場合は、すべてが正常であることを確認できますが、後でスタイルを変更することにした場合、すべてが失敗する可能性があります。

そのため、JavaScriptベースのソリューションをお勧めします。以前にそれを処理した方法は、 jquery truncate plugin を使用することでした。プラグインをアプリに含めます。そして、ページがロードされるたびに、次のようなjavascriptをフックします。

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

切り捨て可能にする必要がある他のスタイルとそれらが尊重する幅を追加し、残りはプラグインが行います。これには、アプリ全体のすべての切り捨てロジックを1か所にまとめておくと便利な追加の利点があります。

3
skorks