Усекать строку с помощью Rails?
Я хочу обрезать строку следующим образом:
ввод:
string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"
выход:
string = "abcd asfsa sadfsaf safsdaf aa...ddddd"
Ответы
Ответ 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
});
}
Добавьте любые другие стили, которые нужно усекать, и ширину, которую они должны соблюдать, плагин делает все остальное. Это имеет дополнительное преимущество, заключающееся в том, что вся ваша усекательная логика для всего приложения в одном месте может быть удобной.