Подтвердить что ты не робот

Усекать строку с помощью Rails?

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

ввод:

string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"

выход:

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

Ответ 1

Взгляните на 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)"

Ответ 2

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

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"

Ответ 3

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

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

50 - это требуемая длина.

Ответ 4

Это может быть не точное решение вашей проблемы, но я думаю, что это поможет вам в правильном направлении, с довольно чистым способом сделать что-то.

Если вы хотите "Привет, мир!" чтобы ограничить первые пять букв, вы можете сделать:

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

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

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

Ответ 5

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

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

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

Ответ 6

Это исходный код 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")

Ответ 7

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

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

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

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