我可以使用正则表达式从URL中提取域吗?

时间:2010-07-21 02:59:33

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

假设我想转此:

http://en.wikipedia.org/wiki/Anarchy

进入这个:

en.wikipedia.org

甚至更好,这个:

wikipedia.org

这在regex中是否可能?

4 个答案:

答案 0 :(得分:9)

为什么Ruby拥有库时使用正则表达式? The URI library

ruby-1.9.1-p378 > require 'uri'
 => true 
ruby-1.9.1-p378 > uri = URI.parse("http://en.wikipedia.org/wiki/Anarchy")
 => #<URI::HTTP:0x000001010a2270 URL:http://en.wikipedia.org/wiki/Anarchy> 
ruby-1.9.1-p378 > uri.host
 => "en.wikipedia.org" 
ruby-1.9.1-p378 > uri.host.split('.')
 => ["en", "wikipedia", "org"] 

拆分主机是分离域的一种方法,但是我不知道可靠的方式来获取基域 - 如果是的话,你不能只计算像“http://somedomain.otherdomain.school.ac.uk”和“www.google.com”这样的网址。

答案 1 :(得分:2)

/http:\/\/([^\/]*).*/将根据您提供的字符串生成en.wikipedia.org。

/http:\/\/.{0,3}\.([^\/]*).*/将生成wikipedia.org。

答案 2 :(得分:1)

现在我知道你没有问过怎么样,而且你没有指定语言,但我还是会回答......(注意,这适用于所有语言子站点,而不仅仅是en.wikipedia ...... )

perl的:

$url =~ s,http://[a-z]{2}\.(wikipedia\.org)/.*,$1,;

红宝石:

url = url.sub(/http:\/\/[a-z]{2}\.(wikipedia\.org)\/.*/, '\1')

PHP:     $ url = preg_replace('| http://[a-z] {2}。(wikipedia.org)/.* |,'$ 1',$ url);

当然,对于这个特殊的例子,你甚至不需要正则表达式,只需要这样做:

url = 'wikipedia.org'

但我开玩笑......

您可能希望处理任何网址并提取域名部分,它也适用于不同国家/地区的域名,例如:foo.co.uk

在这种情况下,我会使用Mark Rushakoff的解决方案获取主机名,然后使用正则表达式来提取域名:

domain = host.sub(/^.*\.([^.]+\.[^.]+(\.[a-z]{2})?)$/, '\1')

希望这有帮助

另外,如果您想了解更多信息,我可以在线获取正则表达式:http://tech.bluesmoon.info/2006/04/beginning-regular-expressions.html

答案 3 :(得分:0)

当然,您所要做的就是搜索http://(。*)/ wiki / Anarchy

在Perl中(对不起,我不认识Ruby,但我希望它类似)

$ string_to_search = ~s / http:////(。)//。应该给你wikipedia.org 要摆脱恩,你只需搜索http:////en(。)//。 .....

应该这样做。

更新:如果你不熟悉正则表达式,我会建议你拿一本正则表达式的书,这本书非常好看,我喜欢它:REGEX BOOK,掌握正则表达式,我前几天在half.com上看到了它对于14.99使用,但澄清我上面提到的,是寻找字符串http://en,然后对于任何事情,直到你找到一个/这全部被捕获在$ 1(在perl中,不确定它是否在ruby中是相同的),一个简单的打印$ 1将打印字符串。

更新:#2抱歉,正则表达中的明星由于某种原因没有出现,所以你看到了。在()和//之后想象一个*,哦,我忘了为en部分添加一个/。最后你不会以.wikipedia.org

结束