Recortar una frase por palabras

Si me pasan una frase muy larga, quiero recortarla hasta 120 caracteres,
pero me gustaría que no se corten palabras. ¿Sabéis si hay alguna
función que lo haga, o tengo que montarme un bucle para que añada
palabra por palabra hasta que llegue al límite?

s2 y gracias

On 21/01/2008, Fernando C. [email protected]
wrote:

Si me pasan una frase muy larga, quiero recortarla hasta 120 caracteres,
pero me gustaría que no se corten palabras. ¿Sabéis si hay alguna
función que lo haga, o tengo que montarme un bucle para que añada
palabra por palabra hasta que llegue al límite?

Buscando un poco he encontrado esto

def awesome_truncate(text, length = 30, truncate_string = “…”)
return if text.nil?
l = length - truncate_string.chars.length
text.chars.length > length ? text[/\A.{#{l}}\w*;?/m][/.*[\w;]/m] +
truncate_string : text
end

La búsqueda en Google que he hecho, una vez comprobado que el helper
truncate no te servía, ha sido esta:

http://www.google.com/search?q=rails%20truncate%20full%20words&sourceid=mozilla2&ie=utf-8&oe=utf-8

Parece que aparecen unas cuantas soluciones.


Manuel, que
piensa que eres una excelente persona y medra en torno a
http://simplelogica.net y/o http://simplelogica.net/logicola/
Recuerda comer mucha fruta y verdura.

On Jan 21, 2008, at 1:29 PM, Fernando C. wrote:

Si me pasan una frase muy larga, quiero recortarla hasta 120
caracteres,
pero me gustaría que no se corten palabras. ¿Sabéis si hay alguna
función que lo haga, o tengo que montarme un bucle para que añada
palabra por palabra hasta que llegue al límite?

ActionView::Helpers::TextHelper#truncate corta palabras.

Se podria hacer de golpe con una regexp, algo asi:

 irb(main):023:0> "foo,\n\n bar baz?".match(/\A.{0,9}\b/m)[0]
 => "foo,\n\n "
 irb(main):024:0> "foo,\n\n bar baz?".match(/\A.{0,10}\b/m)[0]
 => "foo,\n\n bar"

donde pone 9 y 10 iria 120.

– fxn

Cre que algo así te serviria, aunque tendrás que depurar la expresión
regular para que tenga en cuenta los puntos, las comas etc.

def text_wrap(s,width=120)
wrapped_text = “”
s.split(/\s+/).each do |word|
if wrapped_text.size + word.size >= width
return wrapped_text
elsif wrapped_text.empty?
wrapped_text = word
else
wrapped_text << " " << word
end
end
end

El 21/01/2008, a las 13:29, Fernando C.
escribió:

Si me pasan una frase muy larga, quiero recortarla hasta 120

Hola,

“slice” quizás te sirva.

frase.slice(0,120)

2008/1/21 Emili Parreño [email protected]:

Xavier N. wrote:

On Jan 21, 2008, at 1:29 PM, Fernando C. wrote:

Si me pasan una frase muy larga, quiero recortarla hasta 120
caracteres,
pero me gustar�a que no se corten palabras. �Sab�is si hay alguna
funci�n que lo haga, o tengo que montarme un bucle para que a�ada
palabra por palabra hasta que llegue al l�mite?

ActionView::Helpers::TextHelper#truncate corta palabras.

Se podria hacer de golpe con una regexp, algo asi:

 irb(main):023:0> "foo,\n\n bar baz?".match(/\A.{0,9}\b/m)[0]
 => "foo,\n\n "
 irb(main):024:0> "foo,\n\n bar baz?".match(/\A.{0,10}\b/m)[0]
 => "foo,\n\n bar"

donde pone 9 y 10 iria 120.

– fxn

Efectivamente, truncate no sirve, y tampoco sirve slice por el mismo
motivo: cortan las palabras.

Las funciones de Manuel y Emili sí que funcionan, pero me voy a quedar
con la regexp de Xavier, que me ha parecido la solución más elegante.
Gracias a todos!!