Обрезать строку прямо JavaScript - PullRequest
143 голосов
/ 19 августа 2009

Я хотел бы усечь динамически загруженную строку, используя прямой JavaScript. Это URL, поэтому пробелов нет, и мне явно не нужны границы слов, только символы.

Вот что я получил:

var pathname = document.referrer; //wont work if accessing file:// paths
document.getElementById("foo").innerHTML = "<a href='" + pathname +"'>" + pathname +"</a>"

Ответы [ 7 ]

300 голосов
/ 19 августа 2009

Используйте метод подстрока :

var length = 3;
var myString = "ABCDEFG";
var myTruncatedString = myString.substring(0,length);
// The value of myTruncatedString is "ABC"

Так в вашем случае:

var length = 3;  // set to the number of characters you want to keep
var pathname = document.referrer;
var trimmedPathname = pathname.substring(0, Math.min(length,pathname.length));

document.getElementById("foo").innerHTML =
     "<a href='" + pathname +"'>" + trimmedPathname + "</a>"
15 голосов
/ 19 августа 2009

да, подстрока. Вам не нужно делать Math.min; подстрока с более длинным индексом, чем длина строки, заканчивается исходной длиной.

Но!

document.getElementById("foo").innerHTML = "<a href='" + pathname +"'>" + pathname +"</a>"

Это ошибка. Что если в document.referrer есть апостроф? Или различные другие символы, которые имеют особое значение в HTML. В худшем случае код злоумышленника в реферере может внедрить JavaScript на вашу страницу, что является дырой в безопасности XSS.

Несмотря на то, что можно избежать экранирования символов в pathname вручную, чтобы остановить это, это немного болезненно. Вам лучше использовать методы DOM, чем возиться со строками innerHTML.

if (document.referrer) {
    var trimmed= document.referrer.substring(0, 64);
    var link= document.createElement('a');
    link.href= document.referrer;
    link.appendChild(document.createTextNode(trimmed));
    document.getElementById('foo').appendChild(link);
}
11 голосов
/ 29 марта 2012

Думаю, я бы упомянул Sugar.js . У этого есть метод усечения, который является довольно умным.

Из документации :

Обрезает строку. Если параметр split не равен true, усечение не будет разбивать слова на части, а вместо этого отменить слово, где произошло усечение.

Пример:

'just sittin on the dock of the bay'.truncate(20)

Выход:

just sitting on...
9 голосов
/ 28 октября 2015

Следующий код усекает строку и не разбивает слова на части, а вместо этого отбрасывает слово, в котором произошло усечение. Полностью на основе источника Sugar.js.

function truncateOnWord(str, limit) {
        var trimmable = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u2028\u2029\u3000\uFEFF';
        var reg = new RegExp('(?=[' + trimmable + '])');
        var words = str.split(reg);
        var count = 0;
        return words.filter(function(word) {
            count += word.length;
            return count <= limit;
        }).join('');
    }
8 голосов
/ 05 декабря 2018

Вот один метод, который вы можете использовать. Это ответ на один из вызовов FreeCodeCamp:

function truncateString(str, num) {


if (str.length > num) {
return str.slice(0, num) + "...";}
 else {
 return str;}}
2 голосов
/ 27 сентября 2018

Да, substring прекрасно работает:

stringTruncate('Hello world', 5); //output "Hello..."
stringTruncate('Hello world', 20);//output "Hello world"

var stringTruncate = function(str, length){
  var dots = str.length > length ? '...' : '';
  return str.substring(0, length)+dots;
};
0 голосов
/ 26 июня 2019

на тот случай, если вы хотите усечь слово.

function limit(str, limit, end) {

      limit = (limit)? limit : 100;
      end = (end)? end : '...';
      str = str.split(' ');
      
      if (str.length > limit) {
        var cutTolimit = str.slice(0, limit);
        return cutTolimit.join(' ') + ' ' + end;
      }

      return str.join(' ');
    }

    var limit = limit('ILorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus metus magna, maximus a dictum et, hendrerit ac ligula. Vestibulum massa sapien, venenatis et massa vel, commodo elementum turpis. Nullam cursus, enim in semper luctus, odio turpis dictum lectus', 20);

    console.log(limit);
...