Обрезать строку с помощью Rails? - PullRequest
53 голосов
/ 11 августа 2011

Я хочу усечь строку следующим образом:

ввод:

string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"

вывод:

string = "abcd asfsa sadfsaf safsdaf aa...ddddd"

Ответы [ 7 ]

93 голосов
/ 11 августа 2011

Взгляните на усечение , оно частично хочет, чтобы вы хотели. Если вы проверите, было ли оно обрезано или нет, вы можете добавить часть последней части после усеченной части.

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)"
14 голосов
/ 11 августа 2011

В простейшем случае:

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"
13 голосов
/ 05 августа 2014

Вы можете сделать почти тоже самое без Rails:

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

50 - нужная вам длина.

9 голосов
/ 11 мая 2015

Возможно, это не точное решение вашей проблемы, но я думаю, что это поможет вам направить вас в правильном направлении, с довольно чистым способом ведения дел."чтобы ограничиться первыми пятью буквами, вы можете сделать:

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

Если вы хотите эллипсы, просто интерполируйте его:

"#{str[0...5]}..." #=> "Hello..."
8 голосов
/ 30 июня 2015

Усечение с пользовательским пропуском

Подобно тому, что некоторые другие предложили здесь, вы можете использовать метод 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"

Boom!

Спасибо, что спросили об этом. Я думаю, что это полезный способ показать фрагмент более длинного фрагмента текста.

5 голосов
/ 22 августа 2014

Это исходный код 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")
3 голосов
/ 11 августа 2011

На самом деле это интересная проблема, и вы можете решить ее, используя javascript, а не ruby. Вот почему вы, вероятно, где-то отображаете этот текст на экране, и у вас есть только определенное количество доступной ширины. Поэтому вместо сокращения ссылки (или любого другого текста) до количества символов вам действительно нужно убедиться, что отображаемый текст никогда не превышает определенную ширину. Сколько символов может уместиться на определенной ширине, зависит от шрифта, интервала и т. Д. (Стилей CSS), которые вы используете. Вы можете убедиться, что все в порядке, если вы используете решение на основе ruby, но все может упасть, если вы решите изменить свой стиль позже.

Итак, я рекомендую решение на основе JavaScript. Ранее я использовал способ jquery truncate plugin . Включите плагин в ваше приложение. И затем каждый раз, когда страница загружается, подключите какой-нибудь javascript, похожий на следующий:

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

Добавьте все остальные стили, которые нужно обрезать, и ширину, которую они должны соблюдать, плагин сделает все остальное. Это дает дополнительное преимущество, заключающееся в том, что вся логика усечения для всего приложения в одном месте, что может быть удобно.

...