首页 > 解决方案 > 如何使用 Angular 10+ 将 API 中的内容限制为 15 个单词(不是字符)?

问题描述

我想将我的 API 中的一些内容(大约 50 多个单词)限制为 15 个单词,我正在尝试制作一个管道但不起作用,我发现的管道是有限的,但只有字符而不是单词..

我用这个:

@Pipe({
  name: 'limitToPipe'
})
export class LimitToPipePipe implements PipeTransform {

  transform(value: string, limit: number): string {
    let trail = '...';

return value.length > limit ? value.substring(0, limit) + trail : value;


 }

}

正如我之前所说,这不是我想要的,因为我需要返回 15 个单词而不是字符。

有人可以帮我这样做吗?我从早到晚都在浪费时间尝试这样做。

标签: javascriptangularapifrontendbackend

解决方案


首先,请注意您需要准确确定一个单词是什么,例如:您是否在单词定义中包含标点符号?带连字符的单词算一两个单词吗...

我还没有检查你的代码,但看起来你的管道正在工作,所以只需要 15 个字?我会使用正则表达式 - 像这样:

transform (value: string, words: number): string {
  const regex = new RegExp(`((\\W*\\w+){0,${words}})`);
  const result = value.match(regex)[1];
  return result.length < value.length ? result + '...' : result;
}

正则表达式是:

((\W*\w+){0,15}})

它匹配 0 个或多个非单词字符 '\W+',后跟 1 个或多个单词字符 '\w+',然后查找 0 到 15 个匹配项,尽可能多地查找(以防您的初始字符串具有较少超过 15 个字)。

如果您想比 \W \w 更具体地确定要包含的字符,您可以将它们切换为显式字符类。例如为单词字符添加连字符(使连字符变成一个单词):

transform (value: string, words: number): string {
  const chars='-A-Za-z0-9_';
  const regex = new RegExp(`(([^${chars}]*[${chars}]+){0,${words}})`);
  const result = value.match(regex)[1];
  return result.length < value.length ? result + '...' : result;
}

构建一个正则表达式:

(([^-A-Za-z0-9_]*[-A-Za-z0-9_]+){0,15}})

干杯,


推荐阅读