Я не очень хорошо разбираюсь в манипуляциях со строками в JavaScript, и мне было интересно, как можно сократить строку, не обрезая ни слова. Я знаю, как использовать substring, но не indexOf или что-то еще.
Скажем, у меня была следующая строка:
text = "this is a long string I cant display"
Я хочу сократить его до 10 символов, но если он не заканчивается пробелом, закончите слово. Я не хочу, чтобы строковая переменная выглядела так:
"Это длинная строка, которую я не могу"
Я хочу, чтобы он заканчивал слово, пока не появится пробел.
javascript
string
substring
Джош Бедо
источник
источник
" too many spaces ".trim()
Ответы:
Если я правильно понимаю, вы хотите сократить строку до определенной длины (например, сократить
"The quick brown fox jumps over the lazy dog"
, скажем, до 6 символов, не обрезая ни одного слова).Если это так, вы можете попробовать следующее:
источник
maxLength + 1
), но я исправил его, просто добавив эту строку вверху:var yourString += " ";
fox jumps over the lazy dog
деталь, результат будетThe quick brown
, когда и положеноThe quick brown fox
.Есть много способов сделать это, но регулярное выражение - полезный однострочный метод:
Это выражение возвращает первые 11 (любых) символов плюс любые последующие непробельные символы.
Пример сценария:
Вывод:
источник
t.replace(new RegExp("^(.{"+length+"}[^\s]*).*"), "$1")
{30}
Я немного удивлен, что для такой простой задачи существует так много ответов, которые трудно читать, а некоторые, в том числе выбранный, не работают.
Обычно я хочу, чтобы в строке результата было не более
maxLen
символов. Я также использую эту функцию для сокращения заголовков в URL-адресах.str.lastIndexOf(searchValue[, fromIndex])
принимает второй параметр, который является индексом, с которого следует начать поиск в обратном направлении в строке, что делает работу более эффективной и простой.Это пример вывода:
А для пули:
источник
str
этоundefined
. Я добавилif (!str || str.length <= maxLen) return str;
str.length <= maxLen
. В противном случае возвращается пустая строка.Кажется, все забывают, что indexOf принимает два аргумента - строку для сопоставления и индекс символа, с которого нужно начать поиск. Вы можете разбить строку на первый пробел после 10 символов.
источник
В Lodash есть функция, специально написанная для этого:
_.truncate
источник
Основываясь на ответе NT3RP, который не обрабатывает некоторые угловые случаи, я сделал этот код. Это гарантирует, что текст с событием size> maxLength не вернется,
...
в конце добавлено многоточие .Это также обрабатывает некоторые угловые случаи, такие как текст, в котором одно слово> maxLength
Думаю, вы можете легко удалить зависимость jquery, если это вас беспокоит.
источник
$.extend
?Вот решение в одну строку.
источник
Я опаздываю на вечеринку, но вот небольшое и простое решение, которое я придумал, чтобы вернуть количество слов.
Это напрямую не связано с вашими требованиями к персонажам , но дает тот же результат, что, я думаю, вам нужен.
См. Рабочий пример здесь: https://jsfiddle.net/bx7rojgL/
источник
Это исключает последнее слово вместо его включения.
Использование:
источник
Я использовал другой подход. Хотя мне нужен был аналогичный результат, я хотел, чтобы возвращаемое значение было меньше указанной длины.
Изменить Я немного реорганизовал его здесь: Пример JSFiddle . Он воссоединяет исходный массив вместо конкатенации.
источник
Показать фрагмент кода
источник
Вы можете использовать
truncate
однострочник ниже:источник
}
var s = "это длинная строка, и я не могу все объяснить"; сократить (s, 10, '...')
/* "это .." */
источник
Вот еще один фрагмент кода, который обрезается по знакам препинания (искал это, и Google нашел здесь этот вопрос). Пришлось найти решение самостоятельно, вот что я взломал за 15 минут. Находит все вхождения. ! ? и усекает в любой позиции, которая <чем
len
источник
Машинопись, и с эллипсами :)
источник
'Паста с помидорами и шпинатом'
если ты не хочешь разрезать слово пополам
первая итерация:
acc: 0 / acc + cur.length = 5 / newTitle = ['Паста'];
вторая итерация:
acc: 5 / acc + cur.length = 9 / newTitle = ['Паста', 'с'];
третья итерация:
acc: 9 / acc + cur.length = 15 / newTitle = ['Паста', 'с', 'помидор'];
четвертая итерация:
acc: 15 / acc + cur.length = 18 (ограничение) / newTitle = ['Паста', 'с', 'помидор'];
продукт: Паста с помидорами ...
источник
Я написал это для усечения до границы слова, не оставляя знаков препинания или пробелов в конце строки:
источник
Не нашел одобренные решения. Итак, я написал нечто общее, работающее как с первой, так и с последней частью текста (что-то вроде substr, но для слов). Также вы можете указать, хотите ли вы, чтобы пробелы не учитывались при подсчете символов.
источник
Я опоздал на это, но думаю, что эта функция делает именно то, что запрашивает OP. Вы можете легко изменить значения SENTENCE и LIMIT для разных результатов.
В выводе этого фрагмента LIMIT равно 11:
источник
С граничными условиями, такими как пустое предложение и очень длинное первое слово. Кроме того, он не использует специфичную для языка строку api / library.
источник
Вы можете обрезать пробелы следующим образом:
источник
Обновлено из @ NT3RP. Я обнаружил, что, если строка случайно попадает в пробел в первый раз, это приведет к удалению этого слова, что сделает вашу строку на одно слово короче, чем она может быть. Поэтому я просто добавил оператор if else, чтобы проверить, не попадает ли maxLength в пробел.
codepen.io
источник