【问题标题】:How to find a string contains specific character and replace it with a HTML tag如何查找包含特定字符的字符串并将其替换为 HTML 标记
【发布时间】:2019-08-13 18:16:46
【问题描述】:

我想查找字符串中所有以@ 字符开头的单词并将其更改为<a> HTML 标记。

例如:

my_string = 'Hello @username this is your page'
# in my_string i want replace @username like:
@username => <a href='mysite.com/username'>@username</a>
# expected output => 
Hello <a href='mysite.com/username' >@username</a> this is your page

想法?

【问题讨论】:

  • 有什么理由认为Hello &lt;%= link_to @username, "mysite.com/#{@username}" %&gt; this is your page 不是一个可行的选择?

标签: ruby-on-rails regex ruby ruby-on-rails-5


【解决方案1】:

您可以将String#gsub 与正则表达式一起使用:

my_string = 'Hello @username this is your page'
my_string.gsub(/@(\w+)/,'<a href=\'mysite.com/\1\'>@\1</a>' )
#=> "Hello <a href='mysite.com/username'>@username</a> this is your page"

正则表达式解释:

  • 正则表达式中的@\w+ 表示@ 和一个或多个单词字符(\w 代表字母数字字符或下划线)
  • 正则表达式中的(...) 在捕获组中捕获用户名,以后可以在替换中使用该用户名
  • \1 在第二个 gsub 参数中指示 gsub 将第一个捕获组的内容放到字符串的这个位置 - 在这种情况下,用户名

【讨论】:

  • 虽然 gsub 仍然是我的建议,但我不得不假设 OP 正在寻找 my_string.gsub(/(@\w+)/,"@username" =&gt; "&lt;a href=\'mysite.com/#{@username}\'&gt;#{@username}&lt;/a&gt;") 以便替换实例变量
  • 请注意,此解决方案易受 XSS 攻击,因此请确保正确转义用户名或不要将此字符串呈现为 HTML。
【解决方案2】:

mrazza 的回答是做得很好。但是,如果您想避免使用正则表达式,我想这可能会有所帮助。

result = []
splitted_string = 'Hello @username this is your page'.split

splitted_string.each_with_index do |a, i|
  result << a
  if a.include? '@'
    result.insert(i, "<a href='mysite.com/username' >", a, "</a>")
          .delete_at(i + 3)
  end
end
p result.join(' ')
#=> "Hello <a href='mysite.com/username'>@username</a> this is your page"

基本上,您将字符串拆分为一个数组,然后对其进行迭代,如果找到@,则使用索引在其之间添加所需的元素。

如果您不想删除可能很棘手的元素,可以在语句之间写下以下行:

result.insert(i, "<a href='mysite.com/username' >")
result.insert(i + 2, "</a>")

【讨论】:

    猜你喜欢
    • 2011-11-16
    • 2020-11-22
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 2022-11-10
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多