Как насчет:
var text= $('div.contentdetail').text();
var match= text.match( /^(.{100}([^ .]{0,20}[ .])?)(.{20,})$/ );
if (match!==null) {
var visibleText = match[1];
var textToHide = match[3];
...do replacement...
}
{0,20}
будет ожидать пробел или период до 20 символов, прежде чем сдаться и разбить ровно на 100 символов. Это мешает очень длинному слову вырваться из ограничения длины. {20,}
в конце останавливает сопоставление, когда оно скрывает только бессмысленно небольшое количество контента.
Что касается кода замены, не делает это:
.html(visibleText + ('<span>' + textToHide + '</span>'))
Это вставка простого текста в контекст HTML без какого-либо экранирования. Если visibleText
или textToHide
содержит какие-либо символы <
или &
, вы будете их искажать, что может вызвать проблемы безопасности XSS в процессе.
Вместо этого создайте text()
для div и span отдельно, поскольку именно так вы и читаете текст.