Я хочу обрезать строку следующим образом:
ввод:
string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"
выход:
string = "abcd asfsa sadfsaf safsdaf aa...ddddd"
Я хочу обрезать строку следующим образом:
ввод:
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"
Вы можете сделать почти то же самое без Rails:
text.gsub(/^(.{50,}?).*$/m,'\1...')
50
- это требуемая длина.
Это может быть не точное решение вашей проблемы, но я думаю, что это поможет вам в правильном направлении, с довольно чистым способом сделать что-то.
Если вы хотите "Привет, мир!" чтобы ограничить первые пять букв, вы можете сделать:
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"
Boom!
Спасибо, что спросили об этом. Я думаю, что это полезный способ показать фрагмент более длинного фрагмента текста.
Это исходный код 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")
Это действительно интересная проблема, и вы можете ее решить, используя javascript, а не ruby. Вот почему, вероятно, вы показываете этот текст на экране где-то, и у вас есть только определенное количество ширины. Поэтому вместо того, чтобы ваша ссылка (или какой-либо другой текст) была сокращена до нескольких символов, вы действительно хотите, чтобы текст, который вы показываете, никогда не превышал определенную ширину. Сколько символов может поместиться в определенной ширине, зависит от шрифта, интервала и т.д. (Стили css), которые вы используете. Вы можете убедиться, что все в порядке, если вы используете решение на основе Ruby, но все это может упасть, если вы решите изменить свой стиль позже.
Итак, я рекомендую решение на основе javascript. Как я уже обращал его ранее, было использовать jquery truncate plugin. Включите плагин в свое приложение. И затем подключайтесь к некоторому javascript, подобному следующему, каждый раз, когда загружается страница:
function truncateLongText() {
$('.my_style1').truncate({
width: 270,
addtitle: true
});
$('.my_style2').truncate({
width: 100
});
}
Добавьте любые другие стили, которые нужно усекать, и ширину, которую они должны соблюдать, плагин делает все остальное. Это имеет дополнительное преимущество, заключающееся в том, что вся ваша усекательная логика для всего приложения в одном месте может быть удобной.