【问题标题】:Regex to match subdomain?正则表达式匹配子域?
【发布时间】:2011-07-23 23:48:40
【问题描述】:

到目前为止,我有以下内容:

^((http[s]?|ftp):\/\/)(([^.:\/\s]*)[\.]([^:\/\s]+))(:([^\/]*))?(((\/\w+)*\/)([\w\-\.]+[^#?\s]+)(\?([^#]*))?(#(.*))?)?$

一直在针对这些进行测试:

https://www.google.com.ar:8080/dir/1/2/search.html?arg=0-a&arg1=1-b&arg3-c#hash 
https://google.com.ar:8080/dir/1/2/search.html?arg=0-a&arg1=1-b&arg3-c#hash 
https://google.com:8080/dir/1/2/search.html?arg=0-a&arg1=1-b&arg3-c#hash 
http://www.foo.com
http://www.foo.com/
http://blog.foo.com/
http://blog.foo.com.ar/
http://foo.com
http://blog.foo.com
http://foo.com.ar

我正在使用以下工具来测试正则表达式:regex tester

到目前为止,我已经能够产生以下组:

  1. 完整协议
  2. 精简协议
  3. 完整的域名
  4. 子域?
  5. *域名
  6. 端口
  7. 端口号
  8. 网址的其余部分
  9. “目录”的其余部分
  10. 不知道如何删除此群组
  11. 页面名称
  12. 参数字符串
  13. 参数字符串
  14. 哈希标签
  15. 哈希标签

我将使用这个正则表达式来更改我的应用程序的子域以实现跨域重定向超链接。

使用Request.Url作为参数,我想重定向来自

http://example.comhttp://www.example.comhttp://blog.example.com

我怎样才能做到这一点?

我真的不知道当前子域(例如,什么都没有,www、博客或论坛)实际上是什么(如果有的话)...

进行此替换的最佳方法是什么?

我真正需要的是某种方法来找出*域是什么。在http://www.example.comhttp://blog.example.comhttp://example.com 中,我想得到example.com

【问题讨论】:

    标签: c# asp.net regex


    【解决方案1】:

    进行此替换的最佳方法是什么?

    这可能不是您要寻找的答案...但 IMO 最好的方法是使用 System.Uri 类。

    Uri 类将为您轻松提取Host - 然后您可以在“.”上的主机split定界符 - 这应该很容易让您访问当前的子域。


    这只是我的看法——它的形成是因为我发现很难维护像^((http[s]?|ftp):\/\/)(([^.:\/\s]*)[\.]([^:\/\s]+))(:([^\/]*))?(((\/\w+)*\/)([\w\-\.]+[^#?\s]+)(\?([^#]*))?(#(.*))?)?$这样的正则表达式代码

    【讨论】:

    • 这无济于事,因为主机包含 www 部分,并且当您在未明确指定 www 的情况下连接时它不会有帮助
    • 不确定我明白你在说什么。对于任何 Uri,Host 都应包括 url 在 host 部分中包含的任何内容 - 例如对于“sub1.example.com/default.html”,则主机为sub1.example.com
    • 我只是想要一些方法来找出*域是什么。在http://www.example.comhttp://blog.example.comhttp://example.com 中,我想得到example.com
    • 所以使用“System.Uri”来访问“blog.example.com”,然后使用string.split? (对不起 - 真的不明白这个问题!)
    • 如果 url 只是 http://example.com 则根本没有子域部分。这就是问题
    【解决方案2】:

    您可以使用 Uri 类来解析字符串。除了 Segments 之外,还有许多可用的属性:

    Uri MyUri = new Uri("https://www.google.com.ar:8080/dir/1/2/search.html?arg=0-a&arg1=1-b&arg3-c#hash");
    
    foreach (String Segment in MyUri.Segments)
        Response.Write(Segment + "<br />");
    

    【讨论】:

      【解决方案3】:

      我认为您应该重新考虑在这种情况下是否真的需要使用 RegEx;

      • 我认为从 URL 中提取*域非常简单;在“http://www.example.com/?blah=111”的情况下,您可以简单地在第三个斜杠之前执行部分并执行 String.Split('.') 并连接最后两个数组项。如果是“http://www.example.com”,那就更简单了。

        • Regex 模式非常容易出错并且很难维护,据我说,您不会从中受益。我建议你摆脱正则表达式。可能结果会多出 2 到 3 行代码,但它会起作用,您的代码会更易读、更容易理解。

      【讨论】:

      • 如果*域不是 example.com 而是 example.co.uk,例如?
      • 因此增加了 2-3 行代码 :) 在“domain.com.tw”或“domain.co.uk”等域中;为了与这些 url 兼容,您应该测试“保留”域后缀(例如“com”或“co”)的最后一个数组项,并且只有几个需要检查。在这种情况下,您将最后三个数组项作为*域。容易不是吗?