0

我想检测和替换用户输入的文本中的 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).

我从谷歌找到的只是如何检测 URL 并将它们更改为<a>标签。有没有一种方法可以检测 URL,并用自定义代码块替换它们以生成如上例所示的内容?非常感谢!

4

1 回答 1

0

棘手的部分是找到一个匹配所有 url 的正则表达式。例如,这可能有效,来自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."

请注意,这对文本中的第一个(没有协议)没有任何作用,因为它不是 url。如果您期望它也能捡起第一个,那么这对您来说将更加困难。

于 2015-05-20T09:21:43.087 回答