【问题标题】:Can I use a regular expression to extract the domain from a URL?我可以使用正则表达式从 URL 中提取域吗?
【发布时间】:2010-07-21 02:59:32
【问题描述】:

假设我想转这个:

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

进入这个:

en.wikipedia.org

或者更好的是,这个:

wikipedia.org

这在正则表达式中是否可行?

【问题讨论】:

  • 那么,您想从 URL 中解析出域?
  • 总是在字符串中?如果没有,那么您可以执行类似 (en\.) 的操作吗?说这是一个可选的匹配
  • 您可能想澄清您的解决方案需要多通用,以及是否有不想使用标准 URL 解析库的原因。
  • 这是一个试验它的好地方,如果你必须使用正则表达式rubular.com

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


【解决方案1】:

当 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”。

【讨论】:

  • 在引擎盖下它是相同的正则表达式,但你肯定最好使用库
【解决方案2】:

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

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

【讨论】:

  • /^http:\/\/\w+\.(\w+\.\w+)/ 会将其更多地限制为您想要的字符类型。
  • 是的。不过,我可能会省略 ^。如果我们让它尽可能通用,那么匹配任何出现的 url 可能会更好
【解决方案3】:

是的

现在我知道你没有问过如何,也没有指定语言,但我还是会回答......(注意,这适用于所有语言子网站,而不仅仅是 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'

但我开玩笑的......

您可能想要处理任何 URL 并提取域部分,它也应该适用于不同国家的域,例如:foo.co.uk

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

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

希望对你有帮助

另外,如果你想了解更多,我有一个在线正则表达式教程:http://tech.bluesmoon.info/2006/04/beginning-regular-expressions.html

【讨论】:

  • 有趣,我不知道你可以在正则表达式中使用 , 而不是 / 来表示 perl,还有 {2} 是什么意思?
  • 您可以使用任何不是 a-z A-Z 0-9 或空格的字符。你甚至可以像这样使用嵌套大括号:s{http://[a-z]{2}\.(wikipedia\.org)/.*}{$1}; 你甚至不需要使用相同的大括号进行匹配和替换:s{http://[a-z]{2}\.(wikipedia\.org)/.*}&lt;$1&gt;; {2} 意味着匹配两次。
【解决方案4】:

当然,您只需在 http://(.*)/wiki/Anarchy 上搜索即可

在 Perl 中(对不起,我不了解 Ruby,但我希望它是相似的)

$string_to_search =~ s/http:////(.)//. 应该给你 wikipedia.org 要摆脱 en,您可以简单地搜索 http:////en(.)//......

应该可以的。

更新:如果您对 Regex 不熟悉,我建议您选择一本 Regex 书籍,这本书非常棒,我很喜欢:REGEX BOOK,Mastering Regular Expressions,前几天我在 half.com 上看到了对于使用的 14.99,但要澄清我上面的建议,是查找字符串 http://en,然后查找任何内容,直到找到一个 / 这全部在 $1 中捕获(在 perl 中,不确定它在 ruby​​ 中是否相同),一个简单的 print $1 将打印字符串。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-04
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 2014-02-06
    相关资源
    最近更新 更多