2013-08-23 44 views
-1

ruby的字符串中是否有预建的方式来查找类似url的字符串?我听说过URI::Extract,但玩了,似乎只找到http://在字符串中查找网址

我需要能够找到字符串中的任何URL般的字符串,例如前缀的网址:

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

应该全部找到并返还给我。

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

+0

'uri = URI('http://test.com')''uri.host' ...试试这个 –

+4

你对url的定义是什么?当我看到一个时,我知道一个? – 7stud

+0

@ 7stud你问过我吗? –

回答

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"] 
+0

正则表达式没有's'选项。因为你没有'.'作为狂野角色,你的'm'选项是多余的。另外,我没有看到用三个(或五个)行使用'x'选项来写这么短的正则表达式的意思。 – sawa

+0

@sawa,为了规范正则表达式,有些人为每个正则表达式写xms。这个's'似乎没有对红宝石造成任何伤害 - 但要指出的是。 – 7stud

+0

嘿,那个正则表达式看起来像ASCII艺术。我不确定是什么。 –

-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

+1

我停止阅读(?我) - 这不是一个有效的红宝石正则表达式 – pguardiario

+0

@pguardiario,是的。试试:'p“ABC”.match /(?i)abc /'。这个语法允许你做这样的事情:'p“ABc”.match /(?i)ab(? - i)C /',它允许你在正则表达式中打开和关闭标志。 – 7stud

+0

呵呵,我从来不知道。但它仍然不是一个有效的正则表达式。 – pguardiario

0

您可以使用Ruby的内置URI正则表达式,althout 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

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'子域的域)。