我试图编写一个非常简单的正则表达式来查找以符号@
开头的字符串中的所有单词。然后将单词更改为链接。就像你在Twitter上看到的那样你可以提到其他用户名。
到目前为止,我已经写了这个
def username_link(s)
s.gsub(/\@\w+/, "<a href='/username'>username</a>").html_safe
end
我知道它非常基本而且不多,但在我搜索GitHub以找到更复杂的一个之前,我现在要自己编写它,以完全理解它。
我试图找出的是如何引用匹配的单词并将其包含在username
的位置。一旦我能做到这一点,我就可以轻松剥离第一个角色@
。
感谢。
答案 0 :(得分:1)
您可以使用括号和后引用使用\1
(和\2
等)进行捕获:
def username_link(s)
s.gsub(/@(\w+)/, "<a href='/\\1'>\\1</a>").html_safe
end
答案 1 :(得分:0)
您应该将gsub
与后引用一起使用:
str = "I know it's very basic and not much, but @tim I'd rather write it on my own."
def username_to_link(str)
str.gsub(/\@(\w+)/, '<a href="\1">@\1</a>')
end
puts username_to_link(str)
#=> I know it's very basic and not much, but <a href="tim">@tim</a> I'd rather write it on my own.
答案 2 :(得分:0)
以下Regex应该处理其他答案忽略的角落案例
def auto_username_link(s)
s.gsub(/(^|\s)\@(\w+)($|\s)/, "\\1<a href='/\\2'>\\2</a>\\3").html_safe
end
在转换“Hello @username其余信息”等所有内容时,应忽略“someone @ company”或“@ username-1”等字符串
答案 3 :(得分:0)
这个怎么样:
def convert_names_to_links(str)
str = " " + str
result = str.gsub(
/
(?<=\W) #Look for a non-word character(space/punctuation/etc.) preceeding
@ #an "@" character, followed by
(\w+) #a word character, one or more times
/xm, #Standard normalizing flags
'<a href="/\1">@\1</a>'
)
result[1..-1]
end
my_str = "@tim @tim @tim, @@tim,@tim t@mmy?"
puts convert_names_to_links(my_str)
- 输出: -