如何修复带有链接的渲染提及(例如“@test @test2”)但@test2 链接到@test 的页面

Posted

技术标签:

【中文标题】如何修复带有链接的渲染提及(例如“@test @test2”)但@test2 链接到@test 的页面【英文标题】:How do I fix rendering mentions with link (e.g. "@test @test2") but @test2 links to @test's page 【发布时间】:2021-02-11 21:15:51 【问题描述】:

我创建了一个辅助方法来处理推文的正文,这样如果有任何提及,就会添加一个链接。确实可以,但是当提到的用户名与较长用户名的一部分匹配时(例如@test @test2),只会链接@test。

生成的 html 如下所示: @test@test2

我怎样才能使它看起来像这样: @test@test2

这是我的辅助方法:

    def render_body(twit)
     return twit.body unless twit.mentions.any?
     processed_body = twit.body.to_s
     twit.mentions.each do |mention|
       processed_body = processed_body.gsub("@#mention.user.username", "<a href='/user/#mention.user.id'>@#mention.user.username</a>")
     end
     return processed_body.html_safe
    end

我检查了数据库,它确实记录了@test2 的提及,它只是无法呈现它。

【问题讨论】:

【参考方案1】:

简单的字符串替换在这里不起作用,您必须使用锚定的正则表达式。这意味着您永远不会匹配单词的一部分,只会匹配整个单词:

processed_body = processed_body.gsub(/\b@#mention.user.username\b/, 
                                     "<a href='/user/#mention.user.id'>@#mention.user.username</a>")

这里我们用正则表达式替换了模式字符串,并使用\b 将其锚定到单词边界。

【讨论】:

以上是关于如何修复带有链接的渲染提及(例如“@test @test2”)但@test2 链接到@test 的页面的主要内容,如果未能解决你的问题,请参考以下文章

如果我使用带有电子 js 的 vue 路由器,如何修复空白页?

我将如何着手修复嵌入命令中的意外标记/添加 <用户提及> 功能?

将 contentState 渲染到编辑器后,Draft.js 提及插件不起作用

@ 中的空格在链接中提及用户名和小写字母

Elementor:浮动到内部内容右侧的元素会影响内容链接 - 如何修复?

jQuery:修复带有基标记的web链接