如何将字符串中的 URL 呈现为可点击的超链接?

Posted

技术标签:

【中文标题】如何将字符串中的 URL 呈现为可点击的超链接?【英文标题】:How to render URLs in string as clickable hyperlink? 【发布时间】:2021-10-08 20:34:16 【问题描述】:

我有一个来自后端 API 的 comments(字符串)字段,其中包含长文本,也可能包含 URL。我想将它们呈现为超链接(锚定 html 标记)。

我现在的解决方案是使用正则表达式执行字符串替换,将文本中的所有 URL 转换为标签。它工作正常。

但是有没有更好/更全面的方法来做到这一点?也许一些 NPM 包具有更多的功能来呈现不仅仅是 URL(hashtags、@user 等)? 顺便说一句,我大部分时间都在使用 react/angular,任何 JS 推荐都适用。

样本数据:

Hello, My name is John.\n\nThis is my linkedin profile: https://linkedin.com/in/john .\n\nFollow me! Thanks.

预期结果:

Hello, My name is John.
This is my linkedin profile: <a href="https://linkedin.com/in/john">https://linkedin.com/in/john</a> .
Follow me! Thanks.

【问题讨论】:

有lodash.template、handlebars、ejstemplate、vue、react等库。任你选。 ejstemplate 是流行的快速标记 错误。对不起,我应该让问题更清楚。我正在使用反应。但是,任何 JS 库推荐都足够好。 那么正则表达式可能是正确的方法,因为您必须从中提取网址 【参考方案1】:

工作 JS (typescript) 函数执行字符串替换 URL 到 &lt;a&gt; 标记。

const Regex_Url_Str = "(https?:\\/\\/)?" // protocol
+ "((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]2,|" // domain name
+ "((\\d1,3\\.)3\\d1,3))" // OR ip (v4) address
+ "(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*" // port and path
+ "(\\?[;&a-z\\d%_.~+=-]*)?" // query string
+ "(\\#[-a-z\\d_]*)?";

const StringUtil = 
  isValidUrl: (str: string): boolean => new RegExp(Regex_Url_Str, "i").test(str),
  parseHyperlinks: (str: string): string => str.replaceAll(new RegExp(Regex_Url_Str, "gim"), "<a target=\"_blank\" rel=\"noreferrer\" href=\"$&\">$&</a>"),
;

export default StringUtil;
import StringUtil from "../utils/string.ts";

const str = "your_text";
const parsed = StringUtil.parseHyperlinks(str);

正则表达式来自:https://***.com/a/5717133/6122411

【讨论】:

以上是关于如何将字符串中的 URL 呈现为可点击的超链接?的主要内容,如果未能解决你的问题,请参考以下文章

用于将URL自动转换为可单击的超链接(锚定标记)的函数

将 URL 转换为 C# 字符串中的超链接的最简单方法?

PHP 自动将URL转换为可点击超链接(锚标记)的功能

将带有 URL 变量的超链接添加到数据表(jQuery)+ 搜索不起作用

WordPress使用make_clickable函数让文章网址URL自动生成超链接

如何修改PPT中的超链接字体颜色