angular - 我如何将单个单词显示为角度完整消息中的超链接
问题描述
我正在使用插值在我的角度应用程序上显示一条消息。消息也包括一个人的名字。我正在使用 @ 来指定人名。我想要的是任何人的名字出现在我显示的消息中,它应该是一个超链接。当点击链接时,人会被重定向到个人资料。
解决方案
你想建立一个管道指令
事实证明,操作 DOM 元素更适合指令和组件。
这是我的工作StackBlitz 指令。
正则表达式方法
我得到了帮助以找到/@[0-9a-zA-Z]{5,20}(?=\\s|$)/
有效的正则表达式:
// REGEX-MATCH AND REPLACE THE USERNAME SUBSTRING(S)
ngAfterViewInit(){
this.initialText = this.el.nativeElement.innerText;
this.finalText = this.initialText.replace(/@[0-9a-zA-Z]{5,20}(?=\\s|$)/, function(username) {
return `<a href="#${username.substring(1)}">${username}</a>`;
});
循环方法
循环时,您必须测试每个单词以检查@xxxxxxx
用户名的多次出现。
- 获取任意组文本
- 在每个空格处拆分每个单词
- 检查@xx 匹配的每个单词
- @username 文本引用的单词
- 将 @username 实例包装在标签中
- 用 finalText 替换元素的原始文本
- 这不检查特殊字符
- 这不会检查已包装的@usernames
两个版本都在 StackBlitz 中,并且可以innerHTML
替换。
ngAfterViewInit(){
this.initialText = this.el.nativeElement.innerText;
if (this.initialText && this.initialText.length > 0) {
for (let text of this.initialText.split(" ")) {
if (text.startsWith("@") && text.length > 1){
this.finalText += `<a href="#${text.substring(1)}">${text}</a> `;
} else {
this.finalText += text + " ";
}
}
}
}
推荐阅读
- php - Laravel 8:如何将附加参数从控制器传递到集合资源
- python - 如何在pygame中旋转左上角的东西
- firebase - 如何将列表与我的 Firebase 文档列表乱序匹配?
- java - 使用片段时导航抽屉的向上按钮
- javascript - Bootstrap v5.0 'container-lg' 无法正常工作
- python - 我正在阅读 Python Crash Course,它说要创建一个副本而不是编辑真实组,但我已经尝试了两种方式,而且似乎都可以正常工作
- sql - 如何通过一次查询从 SQL 数据库中提取多张图像?
- firebase - 由于组织政策强制执行,无法创建 Firestore
- powershell - 用于删除文件名中具有连续编号的文件的批处理脚本达到一定数量
- php - 要求用户在访问第二张表格之前填写第一张表格?(更改密码)