用javascript在中间截断字符串

0kjbasz6  于 2023-05-12  发布在  Java
关注(0)|答案(8)|浏览(137)

谁有一个方便的方法来截断一个字符串在中间?类似于:

truncate ('abcdefghi', 8);

会导致

'abc...hi'

更新:
更完整一点

  • 如果字符串<= maxLength,则返回字符串
  • 否则,返回一个maxLength版本的字符串,中间去掉一个块,替换为“...”。
  • 将“...”中的三个字符计入总数,因此如果maxLength为8,您将只看到原始字符串中的5个字符
kcrjzv8t

kcrjzv8t1#

这里有一种方法,用substr将字符串切碎:

var truncate = function (fullStr, strLen, separator) {
    if (fullStr.length <= strLen) return fullStr;

    separator = separator || '...';

    var sepLen = separator.length,
        charsToShow = strLen - sepLen,
        frontChars = Math.ceil(charsToShow/2),
        backChars = Math.floor(charsToShow/2);

    return fullStr.substr(0, frontChars) + 
           separator + 
           fullStr.substr(fullStr.length - backChars);
};

See example →

kd3sttzy

kd3sttzy2#

像这样的事。。

function truncate(text, startChars, endChars, maxLength) {
    if (text.length > maxLength) {
        var start = text.substring(0, startChars);
        var end = text.substring(text.length - endChars, text.length);
        while ((start.length + end.length) < maxLength)
        {
            start = start + '.';
        }
        return start + end;
    }
    return text;
}
alert(truncate('abcdefghi',2,2,8));

或者限制为真正的省略号:

function truncate(text, startChars, endChars, maxLength) {
    if (text.length > maxLength) {
        var start = text.substring(0, startChars);
        var end = text.substring(text.length - endChars, text.length);
        return start + '...' + end;
    }
    return text;
}
alert(truncate('abcdefghi',2,2,8));

jsFiddle

gk7wooem

gk7wooem3#

这可能对你正在寻找的东西来说有点“沉重”,但有一个jQuery插件可以做这类事情。
The "Three Dots" plugin

dl5txlt9

dl5txlt94#

基于mVChr's answer的CoffeeScript版本:

truncate = (str, length, separator = '...') ->
  return '' if str is null
  return str if str.length <= length

  pad = Math.round (length - separator.length) / 2
  start = str.substr(0, pad)
  end = str.substr(str.length - pad)

  [start, separator, end].join('')
bis0qfac

bis0qfac5#

通过依赖**@mvChr**解决方案,我建议将@pipe与Typescript一起使用。
首先,你需要创建一个@pipe helper,在这里你将描述truncate的功能。

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'truncateString',
})
export class TreeHelperPipe implements PipeTransform {
  transform(fullStr: string, strLen: number, separator: string): any {
    if (fullStr.length < strLen) {
      return fullStr;
    }

    separator = separator || '...';

    const sepLen = separator.length,
      charsToShow = strLen - sepLen,
      frontChars = Math.ceil(charsToShow / 2),
      backChars = Math.floor(charsToShow / 2);

    return (
      fullStr.substr(0, frontChars) +
      separator +
      fullStr.substr(fullStr.length - backChars)
    );
  }
}

之后,您将能够在模板上使用@pipe helper,如下所示:

<span
  class="item-name"
  [text]="item.name | truncateString: 60"
  [title]="item.name"
></span>

我只将@管道应用于文本,而不应用于title属性(它在一个立交桥窗口中显示文本)。

whlutmcx

whlutmcx6#

我是这样做的:

function truncate(
  fullStr,
  strLen = 8,
  separator = "...",
  frontChars = 3,
  backChars = 4
) {
  if (fullStr.length <= strLen) return fullStr;

  return (
    fullStr.substr(0, frontChars) +
    separator +
    fullStr.substr(fullStr.length - backChars)
  );
}
qzwqbdag

qzwqbdag7#

我个人认为这种方法很好用。

export function truncate(str: string, maxLength: number, location = 'middle') {
      if (str.length <= maxLength) {
        return str;
      }
    
      let partLength = Math.ceil((maxLength - 3) / 2);
      let startStr, endStr;
    
      switch (location) {
        case 'start':
          endStr = str.substring(str.length - maxLength + 3);
          return '...' + endStr;
        case 'end':
          startStr = str.substring(0, maxLength - 3);
          return startStr + '...';
        case 'middle':
        default:
          startStr = str.substring(0, partLength);
          endStr = str.substring(str.length - partLength);
          return startStr + '...' + endStr;
      }
    }
console.log(truncate('abcdefghi', 8, 'start')); // Output: '...defghi'
console.log(truncate('abcdefghi', 8, 'end')); // Output: 'abcdef...'
console.log(truncate('abcdefghi', 8)); // Output: 'abc...hi'
hrysbysz

hrysbysz8#

如果你是在PHP中玩,你可以调用这个,工作正常,可以很好地调整到JS,我假设。

function middle_dots($crumb, $max=30){
  if(strlen($crumb) > $max)
  $crumb = substr_replace($crumb, '...', $max/2, round(-$max/2));
  return $crumb;
}

echo middle_dots('Some long text here would if longer than 30 chars get some ...');

尽情享受吧
史蒂夫

相关问题