rails ruby-on-rails ruby truncate

ruby on rails - rails - Truncar cadena con rieles?



substring ruby (7)

Quiero truncar una cadena de la siguiente manera:

entrada:

string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"

salida:

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


Truncar con omisión personalizada

De forma similar a lo que otros han sugerido aquí, puede usar el método truncate Rails y usar una omisión personalizada que en realidad es la última parte de su cadena:

string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd" truncate(string, length: 37, omission: "...#{string[-5, 5]}") # => "abcd asfsa sadfsaf safsdaf aa...ddddd"

Exactamente lo que querías

Puntos extra

Es posible que desee terminar esto en un método personalizado llamado algo como truncate_middle que hace un trabajo de pies de lujo para usted:

# 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

Y luego solo llámalo así:

string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd" truncate_middle( string, length: 37 ) # => "abcd asfsa sadfsaf safsdaf aa...ddddd"

¡Auge!

Gracias por preguntar sobre esto Creo que es una forma útil de mostrar un fragmento de un texto más largo.


Echa un vistazo a truncate , en parte quiere que quieras. Si prueba si se truncó o no, podría agregar parte de la última parte después de la parte truncada.

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


En el caso más simple:

string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd" tr_string = string[0, 20] + "..." + string[-5,5]

o

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"


Eso es en realidad un problema interesante y es posible que desee resolverlo usando javascript en lugar de ruby. Esta es la razón por la que probablemente esté mostrando este texto en la pantalla en alguna parte, y solo tiene una cierta cantidad de ancho disponible. Entonces, en lugar de tener tu enlace (o cualquier texto) reducido a una cantidad de caracteres, lo que realmente quieres es asegurarte de que el texto que estás mostrando nunca exceda cierto ancho. El número de caracteres que pueden caber en un determinado ancho depende de la fuente, el espaciado, etc. (los estilos CSS) que está usando. Puedes asegurarte de que todo está bien si estás usando una solución basada en rubíes, pero puede que todo falle si decides cambiar tu estilo más adelante.

Por lo tanto, recomiendo una solución basada en JavaScript. La forma en que lo he manejado anteriormente ha sido usar el plugin jquery truncate . Incluye el complemento en tu aplicación. Y luego enganche un javascript similar al siguiente cada vez que se carga la página:

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

Agregue lo que otros estilos deben ser truncables y el ancho que deben respetar, el complemento hace el resto. Esto tiene la ventaja adicional de tener toda tu lógica de truncamiento para toda la aplicación en un solo lugar que puede ser útil.


Este es el código fuente de 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

Entonces, en cuanto a tu caso

string.truncate(37, :omission => "...ddddd")


Puede que esta no sea la solución exacta para su problema, pero creo que lo ayudará a orientarse en la dirección correcta, con una manera bastante limpia de hacer las cosas.

Si quieres "¡Hola Mundo!" para estar limitado a las primeras cinco letras, puedes hacer:

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

Si quieres una elipsis, simplemente interpolala:

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


Puedes hacer casi lo mismo sin Rails:

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

50 es la longitud que necesitas.