javascript - 如何在没有 [innerHTML] 的情况下显示段落中的链接
问题描述
我有一个用 html 链接替换文本链接的管道,我将链接放在带有 [innerHtml] 的段落中。innerHTML 的问题在于,如果有人键入诸如“a<b?”之类的内容。或包含字符“<”或“>”的任何内容,其后面的所有文本都不会显示
< p [innerHTML]="text | generateLinksPipe">
这是管道:
导出类 GenerateLinksPipe 实现 PipeTransform { transform(value: string, aClass?:string): string {
// http://, https://, ftp://
const urlPattern = /\b(?:https?|ftp):\/\/[()a-z0-9-+*&@+#\/%?=+_~_|!:,.;]*[a-z0-9-+&@#\/%=_~_|]/gim;
// www. sans http:// or https://
var pseudoUrlPattern = /(^|[^\/])(www\.[\S]+(\b|$))/gim;
// Email addresses
var emailAddressPattern = /^[a-zA-Z0-9.!#$%&'*+=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*/;
return value
.replace(urlPattern, `<a href="$&" target="_blank">$&</a>`)
.replace(pseudoUrlPattern, `$1<a href="http://$2" target="_blank">$2</a>`)
.replace(emailAddressPattern, `<a href="mailto:$&" target="_blank" >$&</a>`);
} }
我需要一种方法来显示段落中的链接,但能够毫无问题地使用“<”和“>”字符。
解决方案
使用 Angular 时生成 HTML 是错误的方法。Angular 背后的整个想法是,您不再考虑“如何操作 HTML”;相反,我们有一个模型,我们定义这个模型如何映射到视图——这是你的 Angular 模板。
而不是对字符串执行操作并获取 HTML
foo www.bar.com baz => foo <a href="#">bar</a> baz
您应该执行一个操作,为您提供文本模型。
foo www.bar.com baz => [ { type: 'text', value: 'foo ' },
{ type: 'link', href: '#', value: 'www.baz.com' },
{ type: 'text', value: ' baz' } ]
这客观上是一种更好的方法,因为它将您的业务逻辑(什么是链接?)与表示/视图层(我想如何表示它)分开。您现在可以构建 HTML、XHTML、Markdown 或任何您想要的内容。它还使您免于遇到您描述的问题(如果字符串已经包含 HTML 特定字符怎么办)。
你需要的是一个基于这个模型的Angular 模板。请注意,Angular 模板不是HTML!当您在 Angular 中编写模板时,编译器 ( ngc
) 会将该字符串(您的模板)转换为一系列操作 DOM 的 JavaScript 函数。
要创建您需要的内容,您可以执行以下操作。
<ng-container *ngFor="let chunk of parsedData">
<ng-container [ngSwitch]="chunk.type">
<ng-container *ngSwitchCase="'text'">{{ chunk.value }}</ng-container>
<a *ngSwitchCase="'link'" [href]="chunk.href">{{ chunk.value }}</a>
</ng-container>
</ng-container>
推荐阅读
- php - woocommerce 应显示欧盟的相同价格,但其他国家/地区的净值
- sql-server - 不推荐使用 Sql 限制?
- vba - vba selenium在对话框角色中查找元素
- google-cloud-platform - 是否可以在私有目录中实施一种采购审批流程
- jboss - 使用JBoss建立Mysql JTA连接,以报错结束
- javascript - 根据 url 改变值
- hive - 从一个立方体到另一个立方体的调整
- java - 比较可能无限的双精度数
- python - SDK,尝试从群组 Gmail 中调用成员并更新
- spring-restdocs - JsonIgnore 不适用于 Spring Rest-Docs