ตัดจาวาสคริปต์ตรงสตริง


167

ฉันต้องการตัดสตริงที่โหลดแบบไดนามิกโดยใช้ JavaScript แบบตรง มันเป็น URL ดังนั้นจึงไม่มีที่ว่างและฉันไม่สนใจขอบเขตคำเพียงแค่ตัวอักษร

นี่คือสิ่งที่ฉันได้รับ:

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

1
คุณต้องการตัดทอนส่วนใด ตัวอย่างของคุณแสดงความตั้งใจไม่ดี
Larsenal

1
โอ้ตกลง - ฉันต้องการตัดทอน URL ด้วยจำนวนอักขระดังนั้นเมื่อฉันตั้งค่า innerHTML ของ "foo" มันจะไม่ไหลออกจาก div ถ้ามันยาวเกินไป
บ๊อบ

1
* แต่ - เพียง innerHTML ไม่ใช่ชื่อพา ธ var
บ๊อบ

1
ทำไมไม่ใช้ css เพื่อซ่อนการล้นของ div? ล้น: ซ่อน
ซามูเอล

2
@ ซามูเอลเพราะจะเป็นการฝึกฝน UI ที่ไม่ฉลาด - หากผู้ใช้คาดหวังว่าจะเห็น URL ที่พวกเขาเพิ่งมาจาก (document.referrer) และฉันย่อให้สั้นลงฉันต้องการระบุให้พวกเขาเห็นว่าเป็นเพียงส่วนหนึ่ง จาก URL และไม่มีข้อผิดพลาด นอกจากนั้นวิธีการที่คุณเสนอจะตัดตัวละครครึ่งตัวซึ่งดูน่ากลัว
บ๊อบ

คำตอบ:


334

ใช้วิธีการsubstring :

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

1
หากคุณต้องการสตริงย่อยเริ่มต้นจาก 0 ฟังก์ชั่น substr จะทำสิ่งเดียวกันโดยมี 3 ตัวอักษรน้อยกว่า)
jackocnr

1
สตริงย่อยทำงานผิดปกติหากสตริงสั้นกว่าlength- ส่งคืนค่าว่าง
RozzA

หาก "สตริง" ของคุณเป็นตัวเลขคุณจะต้องแทรก.toString().เพื่อแปลงเป็นสตริงที่substring()สามารถจัดการได้
not2qubit


16

ใช่สตริงย่อย คุณไม่จำเป็นต้องทำ Math.min ซับสตริงที่มีดัชนีที่ยาวกว่าความยาวของสตริงจะสิ้นสุดที่ความยาวดั้งเดิม

แต่!

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

นี่เป็นความผิดพลาด เกิดอะไรขึ้นถ้า document.referrer มีเครื่องหมายอะโพสโทรฟี? หรือตัวละครอื่น ๆ ที่มีความหมายพิเศษใน HTML ในกรณีที่เลวร้ายที่สุดรหัสผู้โจมตีในผู้แนะนำสามารถฉีด 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);
}

ฉันสับสนวิธีการแก้ปัญหาของคุณจะหลีกเลี่ยงช่องโหว่ได้อย่างไร
Bob

10
เมื่อคุณใช้เมธอด DOM เช่น 'createTextNode' และ '.href = ... ' คุณกำลังตั้งค่า plaintext ต้นแบบจริงโดยตรง เมื่อคุณเขียน HTML ไม่ว่าจะเป็นไฟล์ HTML หรือผ่าน InnerHTML คุณจะต้องปฏิบัติตามกฎการยกเว้น HTML ดังนั้นในขณะที่ 'createTextNode (' A <B&C ')' ก็ดีด้วย innerHTML คุณจะต้องพูดว่า 'innerHTML =' A & lt; B & amp; C ''
bobince

11

คิดว่าฉันจะกล่าวถึงSugar.js มีวิธีการตัดทอนที่สมาร์ทสวย

จากเอกสาร :

ตัดสตริง เว้นแต่การแบ่งเป็นจริงการตัดทอนจะไม่แยกคำขึ้นและละทิ้งคำที่มีการตัดทอนแทน

ตัวอย่าง:

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

เอาท์พุท:

just sitting on...

9
Sugar is a Javascript library that extends native objects... โดยทั่วไปการขยายวัตถุใน JavaScript นั้นถือว่าเป็นแนวคิดที่ไม่ดี
Jezen Thomas

@JezenThomas บางครั้งความคิดที่ไม่ดีเป็นความคิดที่เหมาะสมที่สุด
viditkothari

10

รหัสต่อไปนี้จะตัดทอนสตริงและจะไม่แยกคำขึ้นมาและทิ้งคำที่การตัดทอนเกิดขึ้นแทน ขึ้นอยู่กับแหล่งที่มา 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
น่าจะเป็นการเพิ่ม "... " ถ้าผลลัพธ์! == str;
Leo Caseiro

9

นี่คือวิธีการหนึ่งที่คุณสามารถใช้ได้ นี่คือคำตอบสำหรับหนึ่งใน FreeCodeCamp Challenges:

function truncateString(str, num) {


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

6

อัปเดตเวอร์ชัน ES6

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...'

นี้มักจะเรียก substring แม้ในขณะที่มันอาจจะไม่จำเป็น ...
คลินต์อีสต์วู้ด

@ClintEastwood ข้อเสนอแนะที่ดีฉันได้ปรับปรุงคำตอบ การตรวจสอบความยาวของสตริงเทียบกับความยาวสูงสุดก็หมายความว่าฉันสามารถลบ showDots const และ ternary ทำให้มันเป็นระเบียบมากขึ้น ไชโย
Sam Logan

3

ใช่ใช้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

ในกรณีที่คุณต้องการตัดทอนด้วยคำ

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>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.