Não sou muito bom com manipulação de string em JavaScript e gostaria de saber como você faria para encurtar uma string sem cortar nenhuma palavra. Eu sei como usar substring, mas não indexOf ou nada muito bem.
Digamos que eu tenha a seguinte string:
text = "this is a long string I cant display"
Eu quero reduzir para 10 caracteres, mas se não terminar com um espaço, termine a palavra. Não quero que a variável string seja assim:
"esta é uma longa corda que eu não posso dis"
Quero que termine a palavra até que ocorra um espaço.
javascript
string
substring
Josh Bedo
fonte
fonte
" too many spaces ".trim()
Respostas:
Se bem entendi, você deseja encurtar uma string para um determinado comprimento (por exemplo, encurtar
"The quick brown fox jumps over the lazy dog"
para, digamos, 6 caracteres sem cortar nenhuma palavra).Se for esse o caso, você pode tentar algo como o seguinte:
fonte
maxLength + 1
), mas eu corrigi simplesmente adicionando esta linha no topo:var yourString += " ";
fox jumps over the lazy dog
parte, o resultado seráThe quick brown
, quando deveria serThe quick brown fox
.Existem muitas maneiras de fazer isso, mas uma expressão regular é um método útil de uma linha:
Esta expressão retorna os primeiros 11 (quaisquer) caracteres mais quaisquer caracteres subsequentes que não sejam de espaço.
Script de exemplo:
Resultado:
fonte
t.replace(new RegExp("^(.{"+length+"}[^\s]*).*"), "$1")
{30}
Estou meio surpreso que para um problema simples como este haja tantas respostas que são difíceis de ler e algumas, incluindo a escolhida, não funcionam.
Normalmente, quero que a string de resultado tenha no máximo
maxLen
caracteres. Eu também uso essa mesma função para encurtar os slugs em URLs.str.lastIndexOf(searchValue[, fromIndex])
recebe um segundo parâmetro que é o índice no qual iniciar a pesquisa para trás na string, tornando as coisas simples e eficientes.Este é um exemplo de saída:
E para a lesma:
fonte
str
forundefined
. Eu adicioneiif (!str || str.length <= maxLen) return str;
str.length <= maxLen
. Caso contrário, ele retorna uma string vazia.Todo mundo parece esquecer que indexOf leva dois argumentos - a string para corresponder e o índice de caractere para começar a procurar. Você pode quebrar a string no primeiro espaço após 10 caracteres.
fonte
Lodash tem uma função escrita especificamente para isso:
_.truncate
fonte
Com base na resposta do NT3RP que não trata de alguns casos extremos, fiz este código. Ele garante não retornar um texto com um evento tamanho> maxLength e reticências
...
foram adicionadas no final.Isso também lida com alguns casos extremos, como um texto que tem uma única palavra sendo> maxLength
Eu acho que você pode remover facilmente a dependência do jquery se isso o incomoda.
fonte
$.extend
ser revertidos?Aqui está uma solução em uma linha.
fonte
Estou atrasado para a festa, mas aqui está uma solução pequena e fácil que encontrei para devolver uma quantidade de palavras.
Não está diretamente relacionado à sua exigência de personagens , mas serve ao mesmo resultado que acredito que você estava procurando.
Veja o exemplo de trabalho aqui: https://jsfiddle.net/bx7rojgL/
fonte
Isso exclui a palavra final em vez de incluí-la.
Uso:
fonte
Eu fiz uma abordagem diferente. Embora eu precisasse de um resultado semelhante, queria manter meu valor de retorno menor que o comprimento especificado.
Editar Refatorei um pouco aqui: Exemplo JSFiddle . Ele reingressa na matriz original em vez de concatenar.
fonte
Exibir trecho de código
fonte
Você pode usar
truncate
uma linha abaixo:fonte
}
var s = "esta é uma longa string e não consigo explicar tudo"; encurtar (s, 10, '...')
/* "isto é .." */
fonte
Aqui está mais um trecho de código que trunca ao longo dos sinais de pontuação (estava procurando por isso e o Google encontrou essa pergunta aqui). Tive que encontrar uma solução sozinho, então foi isso que eu hackeei em 15 minutos. Encontra todas as ocorrências de. ! ? e trunca em qualquer posição destes que seja <que
len
fonte
Texto datilografado e com reticências :)
fonte
Pelo que vale a pena, escrevi isso para truncar para o limite da palavra sem deixar pontuação ou espaço em branco no final da string:
fonte
Não considerou as soluções votadas satisfatórias. Então eu escrevi algo que é genérico e funciona tanto na primeira quanto na última parte do seu texto (algo como substr, mas para palavras). Além disso, você pode definir se deseja que os espaços sejam deixados de fora na contagem de caracteres.
fonte
Cheguei atrasado para isso, mas acho que essa função faz exatamente o que o OP pede. Você pode alterar facilmente os valores SENTENCE e LIMIT para resultados diferentes.
A saída deste snippet é onde o LIMIT é 11 é:
fonte
Com condições de limite como frase vazia e primeira palavra muito longa. Além disso, ele não usa API / biblioteca de string específica de idioma.
fonte
'Macarrão com tomate e espinafre'
se você não quer cortar a palavra pela metade
primeira iteração:
acc: 0 / acc + cur.length = 5 / newTitle = ['Pasta'];
segunda iteração:
acc: 5 / acc + cur.length = 9 / newTitle = ['Pasta', 'com'];
terceira iteração:
acc: 9 / acc + cur.length = 15 / newTitle = ['Macarrão', 'com', 'tomate'];
quarta iteração:
acc: 15 / acc + cur.length = 18 (limite) / newTitle = ['Macarrão', 'com', 'tomate'];
saída: Macarrão com tomate ...
fonte
Você pode cortar espaços com isto:
fonte
Atualizado a partir de @ NT3RP, descobri que se a string atingir um espaço na primeira vez, ela acabará excluindo aquela palavra, tornando a string uma palavra mais curta do que poderia ser. Então, eu apenas coloquei uma instrução if else para verificar se maxLength não cai em um espaço.
codepen.io
fonte