在字符串中查找网址

时间:2013-08-23 04:28:14

标签: ruby-on-rails ruby ruby-on-rails-3

是否有预先构建的方法在ruby中的字符串中查找类似URL的字符串?我听说URI::Extract但是玩弄它,似乎只能找到以http://为前缀的网址

我需要能够在字符串中找到任何类似url的字符串,例如:

http://test.com
http://www.test.com
www.test.com
test.com

应该找到并归还给我。

我知道我可以在正则表达式中解决这个问题,但如果它存在,我宁愿使用预先构建的任何东西。特别应该找到.net.org.edu

4 个答案:

答案 0 :(得分:2)

我认为没有任何预先构建的内容可以找到“带有点的字符串”。这是正则表达式的开始:

str =<<END_OF_STRING
http://test.com
hello.
hello http://www.test.com world
.world
hi www.test.com world
test.com
END_OF_STRING


results = str.scan(/
  \S+
  [.]
  \S+
/xms)

--output:--
["http://test.com", "http://www.test.com", "www.test.com", "test.com"]

答案 1 :(得分:0)

您可以使用Ruby的内置URI正则表达式,但test.com不能成为有效的URI,因此无法返回。

require 'uri'

string =<<END
http://test.com
http://www.test.com
www.test.com
test.com
END

string.scan(URI.regexp) do |*matches|
    p $&
end

如果需要,可以添加另一个表达式,以仅匹配test.com等主机名。

答案 2 :(得分:0)

这对我来说似乎很重要:

\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|\w+\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))\b/ig

然后还会选择实际上不是有效URL的内容,例如abc.88。

它源自Daring Fireball正则表达式(至少在复制和粘贴时不起作用,并且在没有协议或明确的'www'子域的情况下不检测任何域)。

答案 3 :(得分:-2)

您可以使用正则表达式来提取网址。这是一个很好的正则表达式:

(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))

来源:http://daringfireball.net/2010/07/improved_regex_for_matching_urls