javascript - 如何使用 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 个单词而不是字符。
有人可以帮我这样做吗?我从早到晚都在浪费时间尝试这样做。
解决方案
首先,请注意您需要准确确定一个单词是什么,例如:您是否在单词定义中包含标点符号?带连字符的单词算一两个单词吗...
我还没有检查你的代码,但看起来你的管道正在工作,所以只需要 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}})
干杯,
推荐阅读
- angular - Angular 7 行分组与排序
- swift - 绑定@objc var [Double] 数组,setter 从未触发
- linkedin-api - 使用 api v2 将内容共享到linkedin 上的公司页面
- php - 我使用特定的数据库助手并收到错误消息“调用数组上的成员函数 whereRaw()”
- r - 将置信区间添加到引导 abline 以在 R 中绘制图形
- liquibase - 在 generateChangeLog 期间尝试删除不存在的 TMP_% 表时 Liquibase 失败
- delphi - 如何在我的自定义 TControl 中为 Delphi TPathData 创建 onclick 事件?
- php - 当 Blade 包含某个 @include 视图时,如何仅包含 jQuery 函数?
- python - 尝试使用列表连续填充单元格
- vba - 保存具有不同名称的访问报告