2012-05-25 17 views
11

Estoy tratando de hacer una función JS que corte una cadena después de n caracteres, eso funciona. El problema es si está en medio de una palabra, se ve mal, entonces necesito tu ayuda para cortar la palabra completa si está en el medio.Corta una cadena después de n caracteres, pero si está en medio de una palabra corta la palabra completa

Mi código hasta ahora:

if($('#desc').text().length > 505){ 
    str = $("#desc").text(); 
    $('#desc').text(str.substring(0, 505)).append('...'); 
} 

P.S

  • #desc es el div que contiene mi cadena.
  • puede usar jQuery.
+0

Véase también la duplicado relacionado e: ["javascript shorten string without cutting words"] (http://stackoverflow.com/q/5454235/331508). –

Respuesta

17
function cut(n) { 
    return function textCutter(i, text) { 
     var short = text.substr(0, n); 
     if (/^\S/.test(text.substr(n))) 
      return short.replace(/\s+\S*$/, ""); 
     return short; 
    }; 
} 
$('#desc').text(cut(505)); 
+0

Genial, ¿realmente funciona? No lo probé :-) – Bergi

+0

funciona :) –

+0

Debo extrañar algo porque esto no funciona para mí. En mi experiencia, si solo elimina la palabra final en los resultados. Si la última palabra es 'actualmente' y la longitud lo corta en 'cur', elimina 'cur'. Sin embargo, si la longitud lo corta en la palabra completa 'actualmente' sin espacio al final, TODAVÍA elimina esa palabra completa. – jkupczak

-1
function cutAt(text, n) { 
    if(text.length > n){ 
     for (; " .,".indexOf(text[n]) !== 0; n--){ 
     } 
     return text.substr(0, n) + '...'; 
    } 
    return text; 
} 
$('#desc').text(cutAt($('#desc').text(), 505)); 
+0

Gracias por responder pero desafortunadamente no funciona, ¿por qué está vacío el bucle for? –

+0

porque es solo para calcular el valor correcto de i. – Gavriel

+0

no funciona ... –

1

Es posible que desee echar un vistazo a Cutter.js

Cutter.js es una biblioteca usada para truncar el código HTML para limitar su longitud , por número de palabra, sin perder el margen de beneficio.

+0

Gracias, pero no sé el número de palabras, solo quiero el número de caracteres. –

2

Es una combinación de un for loop, charAt, y un medio de poner a prueba el carácter contra los que considera que son delimitadores de palabra. Voy a usar un regular expression para ello:

function splitString(str, index) { 
    var delim = /\s|[,\.]/; // Put any other character you consider 
          // a non-word char in the brackets. 
          // The initial \s is any whitespace, so 
          // space, tab, newline, etc. 
    var ch; 
    var i; 

    // Loop until we find a matching delimiter or we run out of string  
    for (i = index; 
     i >= 0 && !delim.test(str.charAt(i)); 
     --i) { 
    // No body 
    } 
    if (i < 0) { 
    // No break before, split word in middle 
    return index; 
    } 
    return i + 1; 
} 

Live example | source

5

El método lastIndexOf puede encontrar el último carácter de espacio en una cadena,

y pasando un segundo argumento establece un límite superior.

var cutat= string.lastIndexOf(' ',505); 
if(cutat!=-1)string=string.substring(0,cutat)+'...'; 
//else the string is shorter than 505 (or has no spaces...) 
+0

El segundo argumento de String.lastIndexOf() es el índice desde el que comenzar la búsqueda, no el límite superior. https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/lastIndexOf – Will

+2

La misma fuente indica: La cadena de llamada se busca hacia atrás, comenzando en el argumento de índice. – kennebec

+0

@kennebec tiene razón! La dirección es ** hacia atrás ** y, por lo tanto, 'lastIndexOf' es el más adecuado para el trabajo. Para aclarar: 'var longString =" No es tan largo, pero aún necesita ser cortado ";' 'console.log (longString.length, longString.lastIndexOf ('', 15));' '// prints 37 13' – aaki

0

Esta función simple funcionará en cualquier situación, más la adición de 3 puntos si es necesario:

function shortenString(source_string, max_length) { 
    var short = source_string.substr(0, max_length); 
    if (/^\S/.test(source_string.substr(max_length))) 
     return short.replace(/\s+\S*$/, "") + '...'; 
    return short; 
}; 

Ejemplo:

var title = "This function will work in any situation"; 
var short = shortenString(title, 30); 
0

\t \t 
 
    var texte = `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc eu magna at justo bibendum accumsan. Aliquam quam metus, hendrerit eget commodo at, sagittis eu lectus. Nunc quis purus urna. Etiam sollicitudin aliquam dui, vel rutrum ligula tincidunt id. In elementum ultricies ex ut bibendum. Proin ac purus id lorem pharetra commodo. Curabitur euismod commodo eleifend. Proin porttitor aliquet massa eu dapibus. Phasellus vitae tempor nibh. Donec venenatis ligula dui, at eleifend urna facilisis sed. Proin sollicitudin vehicula mi aliquam interdum. Quisque in erat purus. Ut ut ipsum nec odio mollis maximus. Vivamus nec ultricies mi, ut posuere augue.`; 
 
    
 
    function cut(n,text) { 
 
     if(n<text.length){ 
 
      while(text[n] != " " && n>0){ 
 
      n--; 
 
      } 
 
      return text.substr(0,n); 
 
     }else{ 
 
      return text; 
 
     } 
 

 
\t \t } 
 
    
 
    document.getElementById("result").innerHTML = cut(5,texte);
<p id="result"></p>

Cuestiones relacionadas