Regex 用于提取主机名的正则表达式
给定一个URL,我必须使用正则表达式查找主机名 URL可以是多种形式: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
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”已捕获,不应出现任何内容]
什么样的正则表达式可以处理这些情况
请注意:
- 我不是问我的正则表达式有什么问题。我知道哪里出了问题,我就是想不出另一个正则表达式
- 解决方案只需要可靠地提取主机名,而不需要验证它。我稍后会验证这些东西,所以如果正则表达式去掉
fromgoogle!com
,这是可以接受的*https://google!com/foo
/^(?:[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字符!(编辑以在问题中添加该细节)。