繁体   English   中英

截断一串直 JavaScript

[英]Truncate a string straight JavaScript

我想使用直接 JavaScript 截断动态加载的字符串。 它是 url,所以没有空格,我显然不关心单词边界,只关心字符。

这是我得到的:

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

使用子字符串方法:

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>"

这是您可以使用的一种方法。 这是 FreeCodeCamp 挑战之一的答案:

function truncateString(str, num) {
  if (str.length > num) {
    return str.slice(0, num) + "...";
  } else {
    return str;
  }
}

是的,子字符串。 你不需要做一个 Math.min; 索引比字符串长度长的子字符串以原始长度结束。

但!

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

这是个错误。 如果 document.referrer 中有撇号怎么办? 或在 HTML 中具有特殊含义的各种其他字符。 在最坏的情况下,referrer 中的攻击者代码可能会将 JavaScript 注入您的页面,这是一个 XSS 安全漏洞。

虽然可以手动转义路径名中的字符以阻止这种情况发生,但这有点痛苦。 你最好使用 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);
}
["

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('');
    }

更新 ES6 版本

 const truncateString = (string = '', maxLength = 50) => string.length > maxLength ? `${string.substring(0, maxLength)}…` : string // demo the above function console.log( truncateString(prompt("", "This is a test"), 4) )

以为我会提一下 Sugar.js 它有一个非常聪明的截断方法。

文档中:

截断字符串。 除非 split 为真,否则 truncate 不会拆分单词,而是丢弃发生截断的单词。

例子:

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

输出:

just sitting on...

是的, 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;
};

除了 substring 方法,我为此目的找到了一个不错的小 JS 库。

它在 vanilla javascript 中有多种有用的方法来截断字符串

按字符截断:

 var pathname = 'this/is/thepathname'; document.getElementById("foo").innerHTML = "<a class='link' href='" + pathname +"'>" + pathname +"</a>" // call the plugin - character truncation only needs a one line init new Cuttr('.link', { length: 10 });
 <script src="https://cdnjs.cloudflare.com/ajax/libs/cuttr/1.3.2/cuttr.min.js"></script> <div id="foo"></div>

只需将一个class添加到a并初始化插件。

多行文本剪辑也是可能的。
github 页面上的cuttr.js 文档中提到了更多选项,例如单词或句子截断。

如果您想按单词截断。

 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);

您可以借助内部 JavaScript 方法修复此方法

 const truncate = (text, len) => { if (text.length > len && text.length > 0) { return `${text.split(" ").slice(0, len).join(" ")} ...`; } else { return text; } };

 var pa = document.getElementsByTagName('p')[0].innerHTML; var rpa = document.getElementsByTagName('p')[0]; // console.log(pa.slice(0, 30)); var newPa = pa.slice(0, 29).concat('...'); rpa.textContent = newPa; console.log(newPa)
 <p> some text here some text here some text here some text here some text here some text here some text here some text here some text here some text here some text here some text here some text here some text here some text here </p>

var str = "Anything you type in.";
str.substring(0, 5) + "" //you can type any amount of length you want

如果您想通过限制(符号)截断,但您不想为非长文本(例如帖子标题)剪切单词(保持最后一个单词完整):

trancWord(str, limit) {
    str = str.split(' ');
    let summ = 0
    for (let [index, value]  of str.entries()) {
        summ  += value.length
        if (summ > limit) {
            let cutTolimit = str.slice(0, index);
            return str.slice(0, index).join(' ') + ' ' + '...';
        }
    }
    return str.join(' ');
}

对于长字符串(一些长的帖子文本 - Vue-3 用作过滤器):

trancWord  (str, max){
        if (str.length <= max) { return str; }
        let subString = str.substr(0, max);
        return (str ? subString.substr(0, subString.lastIndexOf(' ')) : subString) + '...';
}

要将字符串截断为特定长度,请在 JavaScript 中使用以下单线性箭头函数:

const truncate = (str, len) => str.slice?.(0, len);
    
console.log(truncate("Hello, World!", 5));
// Expected Output: Hello

上面的函数使用了String.prototype.slice方法,它接受一个字符串的一个块并将它作为一个新字符串返回,而不改变原来的字符串。

一行 ES6 解决方案

如果字符串长度超过给定长度,它不仅会截断字符串,还会添加结束字符串。

const limit = (string, length, end = "...") => {
    return string.length < length ? string : string.substring(0, length) + end
}

limit('Hello world', 5) // Hello...
function truncateString(str: string, num: number, ending: string = '...') {
    return str.length > num ? str.slice(0, num) + ending : str;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM