Cắt một chuỗi JavaScript thẳng


166

Tôi muốn cắt bớt một chuỗi được tải động bằng cách sử dụng JavaScript thẳng. Đó là một url, vì vậy không có khoảng trắng và rõ ràng tôi không quan tâm đến ranh giới từ, chỉ các ký tự.

Đây là những gì tôi nhận được:

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

1
Phần nào bạn muốn cắt ngắn? Ví dụ của bạn không truyền đạt ý định rất tốt.
Larsenal

1
oh ok- Tôi muốn cắt bớt URL ở một số lượng ký tự nhất định, để khi tôi đặt bên trongHTML của "foo", nó sẽ không chảy ra khỏi div nếu quá dài.
Bob

1
* nhưng- chỉ làHTML bên trong, không phải tên đường dẫn var.
Bob

1
Tại sao không sử dụng css để ẩn tràn div? tràn: ẩn
Samuel

2
@Samuel Bởi vì nó sẽ kém thông tin về giao diện người dùng - nếu người dùng mong đợi thấy url mà họ vừa đến (document.referrer) và tôi đang rút ngắn nó, tôi muốn nói với họ rằng họ chỉ nhìn thấy một phần của url và không có lỗi. Bên cạnh đó, phương pháp bạn đề xuất sẽ cắt các nhân vật làm đôi, trông sẽ thật kinh khủng.
Bob

Câu trả lời:


333

Sử dụng phương pháp chuỗi con :

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

Vì vậy, trong trường hợp của bạn:

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

1
Nếu bạn muốn một chuỗi con bắt đầu từ 0, thì hàm cơ bản sẽ thực hiện chính xác điều tương tự với 3 ký tự ít hơn;)
jackocnr

1
substr cư xử kỳ lạ nếu chuỗi là ngắn hơn length- trở lại trống rỗng
RozzA

Nếu "chuỗi" của bạn là một số bạn cũng cần chèn .toString().để chuyển đổi nó thành một chuỗi substring()có thể xử lý.
not2qubit


16

vâng, chuỗi con. Bạn không cần phải làm Math.min; chuỗi con có chỉ số dài hơn độ dài của chuỗi kết thúc ở độ dài ban đầu.

Nhưng!

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

Đây là một sai lầm. Điều gì xảy ra nếu document.referrer có dấu nháy đơn? Hoặc nhiều nhân vật khác có ý nghĩa đặc biệt trong HTML. Trong trường hợp xấu nhất, mã kẻ tấn công trong trình giới thiệu có thể đưa JavaScript vào trang của bạn, đây là lỗ hổng bảo mật XSS.

Mặc dù có thể thoát các ký tự trong tên đường dẫn theo cách thủ công để ngăn chặn điều này xảy ra, nhưng điều đó hơi khó khăn. Bạn nên sử dụng các phương thức DOM hơn là đấu tranh với các chuỗi bên trong.

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

Tôi đang bối rối, làm thế nào để giải pháp của bạn tránh được lỗ hổng bảo mật?
Bob

10
Khi bạn sử dụng các phương thức DOM như 'createTextNode' và '.href = ...', bạn đang trực tiếp đặt giá trị văn bản gốc bên dưới. Khi bạn đang viết HTML, trong một tệp HTML hoặc thông qua InternalHTML, bạn phải tuân theo các quy tắc thoát HTML. Vì vậy, trong khi 'createTextNode (' A <B & C ')' vẫn ổn, với InternalHTML, bạn sẽ phải nói 'InternalHTML =' A & lt; B & amp; C ''.
bobince

11

Nghĩ rằng tôi sẽ cho Sugar.js đề cập đến . Nó có một phương pháp cắt ngắn khá thông minh.

Từ tài liệu :

Cắt một chuỗi. Trừ khi phân chia là đúng, cắt ngắn sẽ không phân chia các từ và thay vào đó loại bỏ từ nơi cắt ngắn xảy ra.

Thí dụ:

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

Đầu ra:

just sitting on...

9
Sugar is a Javascript library that extends native objectsPhần mở rộng các đối tượng gốc trong JavaScript thường được coi là một ý tưởng tồi ™.
Jezen Thomas

@JezenThomas Đôi khi ý tưởng tồi là ý tưởng phù hợp nhất.
viditkothari

10

Mã theo sau cắt ngắn một chuỗi và sẽ không phân tách các từ, và thay vào đó loại bỏ từ nơi xảy ra cắt ngắn. Hoàn toàn dựa trên nguồn 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('');
    }

2
Sẽ tốt hơn nếu thêm "..." nếu kết quả! == str;
Leo Caseiro

9

Đây là một phương pháp bạn có thể sử dụng. Đây là câu trả lời cho một trong những Thách thức FreeCodeCamp:

function truncateString(str, num) {


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

6

Phiên bản ES6 đã cập nhật

const truncateString = (string, maxLength = 50) => {
  if (!string) return null;
  if (string.length <= maxLength) return string;
  return `${string.substring(0, maxLength)}...`;
};

truncateString('what up', 4); // returns 'what...'

điều này luôn luôn gọi chuỗi con, ngay cả khi có thể không cần thiết ...
Clint Eastwood

@ClintEastwood phản hồi tốt, tôi đã cập nhật câu trả lời. Kiểm tra độ dài chuỗi so với độ dài tối đa cũng có nghĩa là tôi có thể loại bỏ constDots const và ternary làm cho nó gọn hơn. Chúc mừng.
Sam Logan

3

Vâng, substringhoạt động tuyệt vời:

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

trong trường hợp bạn muốn cắt ngắn bằng từ.

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


0

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>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.