No soy muy bueno con la manipulación de cadenas en JavaScript, y me preguntaba cómo haría para acortar una cadena sin cortar ninguna palabra. Sé cómo usar la subcadena, pero no indexOf ni nada realmente bien.
Digamos que tenía la siguiente cadena:
text = "this is a long string I cant display"
Quiero recortarlo a 10 caracteres, pero si no termina con un espacio, termine la palabra. No quiero que la variable de cadena se vea así:
"esta es una cadena larga que no puedo deshacer"
Quiero que termine la palabra hasta que aparezca un espacio.
javascript
string
substring
Josh Bedo
fuente
fuente
" too many spaces ".trim()
Respuestas:
Si lo he entendido correctamente, desea acortar una cadena a una cierta longitud (por ejemplo, acortar
"The quick brown fox jumps over the lazy dog"
a, digamos, 6 caracteres sin cortar ninguna palabra).Si este es el caso, puede intentar algo como lo siguiente:
fuente
maxLength + 1
), pero lo arreglé simplemente agregando esta línea en la parte superior:var yourString += " ";
fox jumps over the lazy dog
parte, el resultado seráThe quick brown
, cuando debería serThe quick brown fox
.Hay muchas formas de hacerlo, pero una expresión regular es un método útil de una línea:
Esta expresión devuelve los primeros 11 caracteres (cualquiera) más los caracteres posteriores que no sean espacios.
Script de ejemplo:
Salida:
fuente
t.replace(new RegExp("^(.{"+length+"}[^\s]*).*"), "$1")
{30}
Me sorprende un poco que para un problema simple como este haya tantas respuestas que son difíciles de leer y algunas, incluida la elegida, no funcionan.
Por lo general, quiero que la cadena de resultado tenga como máximo
maxLen
caracteres. También uso esta misma función para acortar las babosas en las URL.str.lastIndexOf(searchValue[, fromIndex])
toma un segundo parámetro que es el índice en el que comenzar a buscar hacia atrás en la cadena, lo que hace que las cosas sean eficientes y simples.Esta es una salida de muestra:
Y para la babosa:
fuente
str
esundefined
. Añadíif (!str || str.length <= maxLen) return str;
str.length <= maxLen
. De lo contrario, devuelve una cadena vacía.Todo el mundo parece olvidar que indexOf toma dos argumentos: la cadena para coincidir y el índice de caracteres desde el que comenzar a buscar. Puede romper la cadena en el primer espacio después de 10 caracteres.
fuente
Lodash tiene una función escrita específicamente para esto:
_.truncate
fuente
Basado en la respuesta de NT3RP que no maneja algunos casos de esquina, hice este código. Garantiza no devolver un texto con un evento size> maxLength y
...
se agregó una elipsis al final.Esto también maneja algunos casos de esquina como un texto que tiene una sola palabra que es> maxLength
Supongo que puede eliminar fácilmente la dependencia de jquery si esto le molesta.
fuente
$.extend
ser invertida?Aquí hay una solución en una línea.
fuente
Llego tarde a la fiesta, pero aquí hay una solución pequeña y fácil que se me ocurrió para devolver una cantidad de palabras.
No está directamente relacionado con sus requisitos de personajes , pero tiene el mismo resultado que creo que buscaba.
Vea el ejemplo de trabajo aquí: https://jsfiddle.net/bx7rojgL/
fuente
Esto excluye la última palabra en lugar de incluirla.
Uso:
fuente
Adopté un enfoque diferente. Si bien necesitaba un resultado similar, quería mantener mi valor de retorno menor que la longitud especificada.
Editar Lo refactoricé un poco aquí: Ejemplo JSFiddle . Vuelve a unir la matriz original en lugar de concatenar.
fuente
Mostrar fragmento de código
fuente
Puede utilizar
truncate
una sola línea a continuación:fuente
}
var s = "esta es una cadena larga y no puedo explicar todo"; acortar (s, 10, '...')
/* "esto es .." */
fuente
Aquí hay otra pieza de código que se trunca a lo largo de los signos de puntuación (estaba buscando esto y Google encontró esta pregunta aquí). Tuve que encontrar una solución por mi cuenta, así que esto es lo que pirateé en 15 minutos. Busca todas las apariciones de. ! ? y trunca en cualquier posición de estos que sea <que
len
fuente
Mecanografiado y con puntos suspensivos :)
fuente
Por lo que vale, escribí esto para truncar al límite de la palabra sin dejar signos de puntuación o espacios en blanco al final de la cadena:
fuente
No encontré satisfactorias las soluciones votadas. Así que escribí algo que es un poco genérico y funciona tanto en la primera como en la última parte de tu texto (algo así como substr pero para palabras). También puede establecer si desea que los espacios se omitan en el recuento de caracteres.
fuente
Llegué tarde para esto, pero creo que esta función hace exactamente lo que solicita OP. Puede cambiar fácilmente los valores de SENTENCE y LIMIT para obtener diferentes resultados.
La salida de este fragmento es donde el LÍMITE es 11 es:
fuente
Con condiciones de contorno como una oración vacía y una primera palabra muy larga. Además, no utiliza api / biblioteca de cadenas específicas de un idioma.
fuente
'Pasta con tomate y espinacas'
si no quieres cortar la palabra por la mitad
primera iteración:
acc: 0 / acc + cur.length = 5 / newTitle = ['Pasta'];
segunda iteración:
acc: 5 / acc + cur.length = 9 / newTitle = ['Pasta', 'with'];
tercera iteración:
acc: 9 / acc + cur.length = 15 / newTitle = ['Pasta', 'with', 'tomato'];
cuarta iteración:
acc: 15 / acc + cur.length = 18 (límite límite) / newTitle = ['Pasta', 'with', 'tomato'];
salida: Pasta con tomate ...
fuente
Puede recortar espacios con esto:
fuente
Actualizado desde @ NT3RP Descubrí que si la cadena golpea un espacio la primera vez, terminará borrando esa palabra, haciendo que la cadena sea una palabra más corta de lo que puede ser. Así que lancé una declaración if else para verificar que maxLength no cae en un espacio.
codepen.io
fuente