Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 用于提取主机名的正则表达式_Regex_Pcre - Fatal编程技术网

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

Regex 用于提取主机名的正则表达式,regex,pcre,Regex,Pcre,给定一个URL,我必须使用正则表达式查找主机名 URL可以是多种形式: http://www.google.com/ [预期为“google.com”] https://www.google.com:2000/ [预计为“www.google.com”] http://100.1.25.3:8000/foo/bar?abc.php=xxxx+xxxx[预计为'100.1.25.3'] www.goog

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

URL可以是多种形式:

http://www.google.com/                            [预期为“google.com”]
https://www.google.com:2000/                      [预计为“www.google.com”]
http://100.1.25.3:8000/foo/bar?abc.php=xxxx+xxxx[预计为'100.1.25.3']
www.google.com[预期为“www.google.com”]
10.0.2.2:5000[预计为'10.0.2.2']
localhost/[应为“localhost”]
localhost/foo[应为'localhost']
我能想到的最接近的方法是:

^(?:[^:::+://)*([^://])*
并使用正则表达式的第一个捕获组捕获的字符串

然而,有几个案例失败了:

google.com[未捕获任何内容,应为“google.com”]
http://///x  [“http”已捕获,不应出现任何内容]
什么样的正则表达式可以处理这些情况


请注意:

  • 我不是问我的正则表达式有什么问题。我知道哪里出了问题,我就是想不出另一个正则表达式
  • 解决方案只需要可靠地提取主机名,而不需要验证它。我稍后会验证这些东西,所以如果正则表达式去掉
    google!com
    from
    https://google!com/foo
    ,这是可以接受的*
*。。。甚至可能是可取的,因为主机名可以包含Unicode字符(国际化域名)。

我想到了这个

/^(?:[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)


$
-表示它必须以这个正则表达式结尾

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

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

还显示您的预期输出。似乎与为什么不为此使用uri处理库非常相似?re当然不是一个合适的工具:谢谢你的回答,但是请注意最简单的测试用例(
google.com
)失败了。您不必进行如此严格的检查,因为我将实际处理IDN主机名,它具有unicode字符!(编辑以在问题中添加该细节)。