我想检测并替换用户输入的文本中的URL。一个值得千言万语的例子:
Here's a link to stackoverflow.com, so is http://stackoverflow.com.
=>
Here's a link to [stackoverflow.com](http://stackoverflow.com), so is [http://stackoverflow.com](http://stackoverflow.com).
我在Google上发现的所有内容都是如何检测网址并将其更改为<a>
标记。有没有办法可以检测到URL,并用自定义代码块替换它们以生成上面的示例?非常感谢!
答案 0 :(得分:0)
这个棘手的部分是找到一个匹配所有网址的正则表达式。例如,这可能起作用,来自http://ryanangilly.com/post/8654404046/grubers-improved-regex-for-matching-urls-written
regexp = /\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/?)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s\`!()\[\]{};:\'\".,<>?«»“”‘’]))/i
一旦你获得了正则表达式,然后使用带有块的gsub,例如
text = "Here's a link to stackoverflow.com, so is http://stackoverflow.com."
=> "Here's a link to stackoverflow.com, so is http://stackoverflow.com."
text.gsub(regexp){|url| "FOO#{url}BAR"}
=> "Here's a link to stackoverflow.com, so is FOOhttp://stackoverflow.comBAR."
请注意,这不会对文本中的第一个做任何事情(没有协议),因为它的不是网址。如果你期望它也能拿到第一个,那么对你来说会更难。