正则表达式用于提取主机名

时间:2015-06-16 15:26:44

标签: regex pcre

给定一个URL,我必须使用正则表达式找到主机名。

网址可以有多种形式:

http://www.google.com/                            [expected 'google.com']
https://www.google.com:2000/                      [expected 'www.google.com']
http://100.1.25.3:8000/foo/bar?abc.php=xxxx+xxxx  [expected '100.1.25.3']
www.google.com                                    [expected 'www.google.com']
10.0.2.2:5000                                     [expected '10.0.2.2']
localhost/                                        [expected 'localhost']
localhost/foo                                     [expected 'localhost']

我最接近的可能是:

^(?:[^:]+://)*([^:/]+).*

并使用正则表达式的第一个捕获组捕获的字符串。

但是,有些案例失败了:

google.com   [nothing is captured, expected 'google.com']
http://///x  ['http' is captured, expected nothing]

什么是可以应对这些案件的正则表达式?

请注意:

  • 我不是在问我的正则表达式有什么问题。我知道出了什么问题,我只是想不出另一个正则表达式。
  • 解决方案只需要可靠地提取主机名,无需验证它。我稍后验证了这些内容,因此如果正则表达式从google!com中取出https://google!com/foo,则可以接受*。

* ...甚至可能是理想的,因为主机名可以包含Unicode字符(国际化域名)。

2 个答案:

答案 0 :(得分:1)

我想出了这个

/^(?:[a-zA-Z\d][a-zA-Z\d-]+){1}(?:\.[a-zA-Z]{2,6})+$/

^ - 表示必须以此正则表达式

开头

(?:[a-zA-Z\d][a-zA-Z\d-]+){1} - 匹配主机名

(?:\.[a-zA-Z]{2,6})+ - 匹配一个或多个TLD。 (co.uk)

$ - 表示必须以此正则表达式结束

答案 1 :(得分:1)

您可以在PCRE中使用此正则表达式:

'~^(?:[^:\n]+://)?([^:#/\n]*)~m'

RegEx Demo