긴 문자열을 자르는 현명한 방법


187

누구나 JavaScript를 사용하여 문자열을 자르고 끝 부분을 줄임표보다 더 정교한 솔루션 / 라이브러리가 있습니까?

if (string.length > 25) {
  string = string.substring(0, 24) + "...";
}

5
"더 정교하다"는 무슨 뜻입니까? 단어 경계를 고려한 기능?
Residuum

2
HTML 태그 중간에서 잘리지 않습니다.
Sz.

답변:


366

기본적으로 주어진 문자열의 길이를 확인합니다. 주어진 길이보다 길면 n길이 n( substr또는 slice)로 …자르고 html 엔티티 (…)를 잘린 문자열에 추가하십시오.

이러한 방법은 다음과 같습니다

function truncate(str, n){
  return (str.length > n) ? str.substr(0, n-1) + '…' : str;
};

'더 정교'하여 문자열의 마지막 단어 경계에서 잘림을 의미하는 경우 추가 검사가 필요합니다. 먼저 문자열을 원하는 길이로 자르고 그 결과를 마지막 단어 경계로 자릅니다.

function truncate( str, n, useWordBoundary ){
  if (str.length <= n) { return str; }
  const subString = str.substr(0, n-1); // the original check
  return (useWordBoundary 
    ? subString.substr(0, subString.lastIndexOf(" ")) 
    : subString) + "&hellip;";
};

String함수를 사용하여 기본 프로토 타입을 확장 할 수 있습니다 . 이 경우 str매개 변수를 제거하고 str함수 내에서 다음으로 대체해야합니다 this.

String.prototype.truncate = String.prototype.truncate || 
function ( n, useWordBoundary ){
  if (this.length <= n) { return this; }
  const subString = this.substr(0, n-1); // the original check
  return (useWordBoundary 
    ? subString.substr(0, subString.lastIndexOf(" ")) 
    : subString) + "&hellip;";
};

더 독단적 인 개발자들은 당신을 강력하게 사로 잡을 수도 있습니다 ( " 당신이 소유하지 않은 객체를 수정하지 마십시오 .")

String프로토 타입 을 확장하지 않는 방법 은 사용자가 제공 한 (긴) 문자열과 잘라 내기위한 앞서 언급 한 방법을 포함하는 자신 만의 헬퍼 객체를 만드는 것입니다. 이것이 아래 스 니펫의 기능입니다.

마지막으로 CSS를 사용하여 HTML 노드에서 긴 문자열을자를 수 있습니다. 통제력은 떨어지지 만 실용적 솔루션 일 수 있습니다.


5
예를 들어 문자열이 500자를 초과하는 경우와 같이 "하드"및 "소프트"제한을 고려해야합니다. 사용자가 전체 텍스트를보고 링크를 클릭 할 때 유용 할 수 있습니다. 그것을 위해. 결과적으로 1 ~ 2 문자를 더로드하면 실제로보기 흉하게 보입니다.
Maxim Sloyko

2
두 번째 매개 변수 substr는 길이이므로 substr(0,n)첫 번째 n문자 로 제한 해야합니다 .
JohnnyHK

10
소유하지 않은 개체는 수정하지 마십시오. nczonline.net/blog/2010/03/02/…
Charlie Kilian

5
코드 예제 &hellip;에서을 줄임표 ( ...)로 바꾸는 것이 좋습니다 . API와의 상호 작용을 위해 이것을 사용하려는 경우 HTML이 아닌 엔터티가 필요합니다.
AlbertEngelB 2014

1
@RuneJeppesen 당신이 맞아요. 방법을 조정했습니다. 내 방어 : 대답은 7 년 전;)
KooiInc

62

이것은 Firefox에서만 수행해야합니다.

다른 모든 브라우저는 CSS 솔루션을 지원합니다 ( 지원 테이블 참조 ).

p {
    white-space: nowrap;
    width: 100%;                   /* IE6 needs any width */
    overflow: hidden;              /* "overflow" value must be different from  visible"*/ 
    -o-text-overflow: ellipsis;    /* Opera < 11*/
    text-overflow:    ellipsis;    /* IE, Safari (WebKit), Opera >= 11, FF > 6 */
}

아이러니 한 사실은 Mozilla MDC에서 해당 코드 스 니펫을 얻은 것입니다.


1
mattsnider.com/css/css-string-truncation-with-ellipsis 를 사용하여 FF에서도 작동합니다.
Neal

와우 이것은 모바일 Safari를위한 완벽한 솔루션입니다. 감사합니다!
samvermette 2019

9
아주 좋은 CSS 접근 방식. 참고로 의도 한대로 한 줄의 텍스트에서만 작동합니다 white-space: nowrap;. 둘 이상의 줄에 관해서는 JavaScript가 붙어 있습니다.
insertusername 여기

또한 전체 요소에 대해서만 작동합니다. span 또는 다른 html 요소에서 잘라내려는 비트를 줄 바꿈하지 않고 문자열의 일부를 잘라내려면 다음과 같이 작동하지 않습니다.Your picture ('some very long picture filename truncated...') has been uploaded.
Chris

1
OP는 자바 스크립트 솔루션을 요구했습니다
vsync

25

사람들이 CSS 대신 JavaScript로 이것을하기를 원하는 정당한 이유가 있습니다.

JavaScript에서 8 자 (줄임표 포함)로 자르려면

short = long.replace(/(.{7})..+/, "$1&hellip;");

또는

short = long.replace(/(.{7})..+/, "$1…");

1
줄임표를 세면 9 자입니다. 잘린 후 8이어야하는 경우 .replace(/^(.{7}).{2,}/, "$1…");대신 사용하십시오
Okku

long그리고 short나이 인 ECMAScript 사양에 의해 미래의 키워드 (ECMAScript를 1 ~ 3까지)로 예약되어 있습니다. 참조 MDN은 : 미래 나이 기준에 키워드를 예약
리카르도


9
('long text to be truncated').replace(/(.{250})..+/, "$1…");

어떻게 든 vuejs 앱에서 붙여 넣기 또는 작성된 텍스트의 종류에 대해 위의 코드가 작동하지 않았습니다. 그래서 lodash truncate를 사용 했으며 이제는 잘 작동합니다.

_.truncate('long text to be truncated', { 'length': 250, 'separator': ' '});

좋은 현대 답변!
ykonda

나는 그 본문이 무엇인지 궁금하다. 비 라틴 문자를 사용 했습니까?
Adam Leggett

그것은 단지 lorem ipsum이었다
Afraz Ahmad

7

다음은 다른 제안보다 개선 된 솔루션입니다.

String.prototype.truncate = function(){
    var re = this.match(/^.{0,25}[\S]*/);
    var l = re[0].length;
    var re = re[0].replace(/\s$/,'');
    if(l < this.length)
        re = re + "&hellip;";
    return re;
}

// "This is a short string".truncate();
"This is a short string"

// "Thisstringismuchlongerthan25characters".truncate();
"Thisstringismuchlongerthan25characters"

// "This string is much longer than 25 characters and has spaces".truncate();
"This string is much longer&hellip;"

그것:

  • 25 자 뒤 첫 공백에서 자릅니다.
  • JavaScript String 객체를 확장하여 모든 문자열에서 사용할 수 있습니다.
  • 잘림으로 인해 후행 공백이 생기면 문자열이 잘립니다.
  • 잘린 문자열이 25자를 초과하면 유니 코드 헬리콥터 엔티티 (타원체)를 추가합니다.

7

내가 찾은 최고의 기능. 텍스트 줄임표에 대한 크레딧 .

function textEllipsis(str, maxLength, { side = "end", ellipsis = "..." } = {}) {
  if (str.length > maxLength) {
    switch (side) {
      case "start":
        return ellipsis + str.slice(-(maxLength - ellipsis.length));
      case "end":
      default:
        return str.slice(0, maxLength - ellipsis.length) + ellipsis;
    }
  }
  return str;
}

:

var short = textEllipsis('a very long text', 10);
console.log(short);
// "a very ..."

var short = textEllipsis('a very long text', 10, { side: 'start' });
console.log(short);
// "...ng text"

var short = textEllipsis('a very long text', 10, { textEllipsis: ' END' });
console.log(short);
// "a very END"

5

모든 최신 브라우저는 이제 텍스트 줄이 사용 가능한 너비를 초과하면 줄임표를 자동으로 추가하기위한 간단한 CSS 솔루션을 지원합니다.

p {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

(효과를 주려면 요소의 너비를 어떤 식 으로든 제한해야합니다.)

https://css-tricks.com/snippets/css/truncate-string-with-ellipsis/를 기반으로 합니다.

이 방법은 문자 수에 따라 제한 되지 않습니다 . 여러 줄의 텍스트를 허용해야하는 경우 에도 작동하지 않습니다 .


2
이것은 한 줄 문장에만 유용하며 CSS를 통해 여러 줄 예제를 수행 할 수있는 방법은 없습니다.
Hooman Askari

우연이 아닌 왼쪽의 줄임표를 만들 수있는 방법이 있습니까?
GreenAsJade

1
@GreenAsJade 나는 당신이 text-direction: rtland 를 사용하여 그것을 달성 할 수 있다고 생각합니다 text-align: left. davidwalsh.name/css-ellipsis-left
Sean the Bean

4

대부분의 현대 자바 스크립트 프레임 워크 ( JQuery와 , 프로토 타입 , ...) 그 핸들이 String에 식은 유틸리티 기능을 가지고있다.

다음은 프로토 타입의 예입니다.

'Some random text'.truncate(10);
// -> 'Some ra...'

이것은 다른 사람이 다루거나 유지하기를 원하는 기능 중 하나처럼 보입니다. 더 많은 코드를 작성하는 대신 프레임 워크가 처리하도록하겠습니다.


8
jQuery에는 이것에 대한 것이 없다고 생각합니다.
alex

2
. Underscore.js가하는 - _ ( '안녕하세요 세계) 잘라 내기 (5) =>'안녕 ... '_ ('안녕하세요 ') 잘라 내기 (10) =>'안녕하세요 '.
JayCrossler

3
Pure Underscore에는 다음 truncate()중 하나 가없는 것 같습니다 . underscore.string 과 같은 확장이 필요할 수 있습니다 .
martin

2
이것은 완전히 정답입니다. 밑줄은 모르지만 lodash는 _.trunc정확히 이것을 수행합니다.
leftclickben

2
정답은 lodash.trunc 또는 underscore.string.truncate를 사용하는 것입니다.
ooolala

2

아마도 누군가가 null을 처리하는 위치의 예를 놓쳤을 수도 있지만 null이있을 때 3 개의 TOP 답변이 효과가 없었습니다 (오류 처리가 있고 백만 가지가 질문에 대답하는 사람의 책임이 아님을 알고 있지만 나는 기존 함수를 다른 사람들에게 제공 할 것이라고 생각한 훌륭한 잘림 줄임표 답변 중 하나와 함께 사용했습니다.

예 :

자바 스크립트 :

news.comments

절단 기능 사용

news.comments.trunc(20, true);

그러나 news.comments가 null 인 경우 "단절"

결정적인

checkNull(news.comments).trunc(20, true) 

KooiInc의 trunc 기능 제공

String.prototype.trunc =
 function (n, useWordBoundary) {
     console.log(this);
     var isTooLong = this.length > n,
         s_ = isTooLong ? this.substr(0, n - 1) : this;
     s_ = (useWordBoundary && isTooLong) ? s_.substr(0, s_.lastIndexOf(' ')) : s_;
     return isTooLong ? s_ + '&hellip;' : s_;
 };

내 간단한 null 검사기 (리터럴 "null"항목도 검사합니다 (정의되지 않은 "", null, "null"등을 잡습니다.)

  function checkNull(val) {
      if (val) {
          if (val === "null") {
              return "";
          } else {
              return val;
          }
      } else {
          return "";
      }
  }

다음은 수정 된 버전입니다. 프로토 타입 사용을 피하고, 함수에 널 검사를 통합하며, 테스트 / 데모 사용법이 있습니다. codepen.io/mahemoff/pen/LGEdzy
mahemoff

프로토 타입에 문제가 있습니까? 그냥 궁금해
Tom Stickel

내 별도의 널 (null) 체크 기능에 대한 이유는 실제로 널 (null)을 확인하는 것입니다, NaN의 빈 문자열 ( ""), 0, 거짓과 "널"하지만 당신의 FX와 같은 전체 I 정의되지 않은
톰 Stickel

1
그러나 그것은 의견과 사용 맥락의 문제이지만, 다른 라이브러리와 함께 작업 할 때 프로토 타입이 똑같이 무시 될 수 있기 때문에 프로토 타입이보기 싫습니다. (또는 드문 경우이지만 동일한 이름의 기능이 나중에 표준 언어 기능으로 도입 될 수 있습니다.)
mahemoff

그래, 난 당신과 동의
톰 Stickel

2

때로는 파일 이름이 번호가 매겨져 색인이 시작 또는 끝에있을 수 있습니다. 그래서 줄의 중심에서 짧게하고 싶었습니다.

function stringTruncateFromCenter(str, maxLength) {
    const midChar = "…";      // character to insert into the center of the result
    var left, right;

    if (str.length <= maxLength) return str;

    // length of beginning part      
    left = Math.ceil(maxLength / 2);

    // start index of ending part   
    right = str.length - Math.floor(maxLength / 2) + 1;   

    return str.substr(0, left) + midChar + str.substring(right);
}

UTF-8에서 1 바이트 이상으로 채우기 문자를 사용했습니다.



1

나는 Kooilnc의 솔루션을 찬성했습니다. 정말 멋진 컴팩트 솔루션. 내가 다루고 싶은 작은 경우가 하나 있습니다. 어떤 이유로 든 누군가가 긴 문자 시퀀스를 입력하면 잘리지 않습니다.

function truncate(str, n, useWordBoundary) {
    var singular, tooLong = str.length > n;
    useWordBoundary = useWordBoundary || true;

    // Edge case where someone enters a ridiculously long string.
    str = tooLong ? str.substr(0, n-1) : str;

    singular = (str.search(/\s/) === -1) ? true : false;
    if(!singular) {
      str = useWordBoundary && tooLong ? str.substr(0, str.lastIndexOf(' ')) : str;
    }

    return  tooLong ? str + '&hellip;' : str;
}

1

빠른 인터넷 검색으로 이것을 발견 했습니다 ... 효과가 있습니까?

/**
 * Truncate a string to the given length, breaking at word boundaries and adding an elipsis
 * @param string str String to be truncated
 * @param integer limit Max length of the string
 * @return string
 */
var truncate = function (str, limit) {
    var bits, i;
    if (STR !== typeof str) {
        return '';
    }
    bits = str.split('');
    if (bits.length > limit) {
        for (i = bits.length - 1; i > -1; --i) {
            if (i > limit) {
                bits.length = i;
            }
            else if (' ' === bits[i]) {
                bits.length = i;
                break;
            }
        }
        bits.push('...');
    }
    return bits.join('');
};
// END: truncate

1

텍스트 오버플로 : 줄임표는 필요한 속성입니다. 이것과 오버플로 : 특정 너비로 ​​숨겨지면 끝에 세 가지 기간 효과를 가져올 수있는 모든 것 ... 공백을 추가하는 것을 잊지 마십시오 : 줄 바꿈 또는 텍스트가 여러 줄로 표시됩니다.

.wrap{
  text-overflow: ellipsis
  white-space: nowrap;
  overflow: hidden;
  width:"your desired width";
}
<p class="wrap">The string to be cut</p>

1
간결함은 허용되지만 자세한 설명이 더 좋습니다.
Armali

mwilcoxSean the Bean은 이미이 솔루션을 게시했습니다.
앤드류 마이어스

1
단 한 줄의 텍스트를 사용할 수 있습니다
코오롱 싸이언스 밸리 Pepyako

텍스트 오버플로 : 줄임표가 완벽합니다 !!
zardilior

0

c_harm의 대답은 제 생각에 가장 좋습니다. 사용하고 싶은 경우는 양해 바랍니다

"My string".truncate(n)

리터럴 대신 regexp 객체 생성자를 사용해야합니다. 또한 \S변환 할 때 탈출해야 합니다.

String.prototype.truncate =
    function(n){
        var p  = new RegExp("^.{0," + n + "}[\\S]*", 'g');
        var re = this.match(p);
        var l  = re[0].length;
        var re = re[0].replace(/\s$/,'');

        if (l < this.length) return re + '&hellip;';
    };

모든 의견과 적절한 변수 명명에 대해 들었습니까?
자전거

@bicycle 코드는 위의 다른 답변에서 복사 및 수정되므로 너무 무례하고 불쾌 할 필요가 없습니다.
Matt Fletcher

0

다음 코드 사용

 function trancateTitle (title) {
    var length = 10;
    if (title.length > length) {
       title = title.substring(0, length)+'...';
    }
    return title;
}

0

Kooilnc의 솔루션 수정 :

String.prototype.trunc = String.prototype.trunc ||
  function(n){
      return this.length>n ? this.substr(0,n-1)+'&hellip;' : this.toString();
  };

잘릴 필요가없는 경우 String 객체 대신 문자열 값을 반환합니다.


이것은 질문에 대한 답변을 제공하지 않습니다. 작성자의 의견을 비판하거나 설명을 요청하려면 게시물 아래에 댓글을 남겨주세요. 언제든지 자신의 게시물 에 댓글 수 있으며 평판 이 충분 하면 게시물댓글 수 있습니다 .
스펜서 Wieczorek

아 나는 지금 구별을 본다. 참조 주셔서 감사합니다. @Kooilnc가 그것을 볼 것이라는 희망에 대한 의견을 남기고 싶었고 동의했을 경우 수락 된 답변을 편집 할 수는 있었지만 평판이 없었습니다.
qwales1

0

나는 최근에 이것을해야했고 결국

/**
 * Truncate a string over a given length and add ellipsis if necessary
 * @param {string} str - string to be truncated
 * @param {integer} limit - max length of the string before truncating
 * @return {string} truncated string
 */
function truncate(str, limit) {
    return (str.length < limit) ? str : str.substring(0, limit).replace(/\w{3}$/gi, '...');
}

기분이 좋고 깨끗합니다. :)


1
결과 문자열 3자를 한도보다 길게 만들 수 있습니다.
Hauke

0

.slice ()를 사용하는 것이 좋습니다. 첫 번째 인수는 시작 색인이고 두 번째 인수는 종료 색인입니다. 그 사이의 모든 것은 당신이 돌아 오는 것입니다.

var long = "hello there! Good day to ya."
// hello there! Good day to ya.

var short  = long.slice(0, 5)
// hello

0

어딘가 스마트 : D

//My Huge Huge String
    let tooHugeToHandle = `It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).`
    
//Trim Max Length
 const maxValue = 50
// The barber.
 const TrimMyString = (string, maxLength, start = 0) => {
//Note - `start` is if I want to start after some point of the string
    	if (string.length > maxLength) {
    	let trimmedString = string.substr(start, maxLength)
    	 return (
    	   trimmedString.substr(
    	   start,
    	   Math.min(trimmedString.length,   trimmedString.lastIndexOf(' '))
           ) + ' ...'
         )
       }
    return string
}

console.log(TrimMyString(tooHugeToHandle, maxValue))


-1

이 기능은 공간과 단어 부분을 자릅니다. (예 : 어머니가 나방으로 ...)

String.prototype.truc= function (length) {
        return this.length>length ? this.substring(0, length) + '&hellip;' : this;
};

용법:

"this is long length text".trunc(10);
"1234567890".trunc(5);

산출:

이건 ...

12345 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.