我使用以下标记将提及内容插入到文本区域中: @User Name Can Have Spaces(userId: number) 例如@Javier Hernadez(5)

我有一个 JSON 用户列表: var users = [{name: 'Javier Hernandez',id: 5},{...}];

现在我想将标记转换为纯 HTML 代码:

var myHtml = "..."; // loaded externally and contains the markup 
var matches = myHtml.match(/@([a-z\d_]+)/ig); 

但这不适用于带空格的用户名,而且我无法获取用户 ID。

我现在将迭代匹配项,检查标记中的用户是否存在于我的 users 中数组并替换模板字符串中的匹配

<a href="path/to/user/{id}>{name}</a>

我该如何正确地做到这一点?

请您参考如下方法:

首先,分析您当前的正则表达式以及它不起作用的原因:

  • @ 是文字 @ 字符,这里没什么可看的
  • [...] 是一个字符类。它将匹配它包含的任何(一个)字符
  • [a-z\d_] 是由每个小写字母、每个数字(由其自己的字符类 \d 表示)和下划线组成的字符类
  • + 是一个量词,表示它所修饰的 token 必须至少匹配一次,并且可以匹配多次。这里它适用于之前的字符类
  • /pattern/flags 是 Javascript 的正则表达式语法之一
  • i 是不区分大小写的标志。在这种情况下,这意味着字符类也将匹配大写字母,尽管它只包含小写字母
  • g 是全局标志。这意味着正则表达式将尝试匹配多个结果,而不是在第一次遇到时返回。

因此,您尝试匹配 @User Name Can Have Spaces(userId: number),但您的正则表达式不匹配您提到的空格,也不匹配括号。

您可以将这三个字符添加到字符类中,如下所示:

/@([a-z\d_ ()]+)/gi 

但是,至少在我看来,对您想要匹配的内容的更好翻译如下:

/@[a-z\d_ ]+\(\d+\)/gi 

我们匹配的用户名可以包含字母、数字、下划线和空格,后跟左括号、数字和右括号。括号必须被转义,以便它们被理解为文字字符而不是正则表达式组。

如果您想轻松地分别提取用户名和用户 ID,您可能需要使用以下命令,将它们分别分组到各自的组中:

/@([a-z\d_ ]+)\((\d+)\)/gi 

这是一个regex101 link进行测试。


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!