检测并替换文本中的URL

时间:2015-05-20 08:38:04

标签: ruby-on-rails autolink

我想检测并替换用户输入的文本中的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,并用自定义代码块替换它们以生成上面的示例?非常感谢!

1 个答案:

答案 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."

请注意,这不会对文本中的第一个做任何事情(没有协议),因为它的不是网址。如果你期望它也能拿到第一个,那么对你来说会更难。