我有很多像这样的域名:
http://subdomain.example.com (example.com 的域名不变,但子域名不同)。
我需要获取“子域名”。
能否有耐心学习正则表达式的好心人帮助我?
我有很多像这样的域名:
http://subdomain.example.com (example.com 的域名不变,但子域名不同)。
我需要获取“子域名”。
能否有耐心学习正则表达式的好心人帮助我?
以上正则表达式的问题是:如果你不知道协议是什么,或者不知道域名后缀是什么,你将会得到一些意想不到的结果。这里有一个小的正则表达式可以解决这些情况。 :D
/(?:http[s]*\:\/\/)*(.*?)\.(?=[^\/]*\..{2,5})/i //javascript
如果存在子域名,此代码应始终在第1组返回子域名。以下是JavaScript示例,但对于支持正先行断言的任何其他引擎也应该有效:
// EXAMPLE of use
var regex = /(?:http[s]*\:\/\/)*(.*?)\.(?=[^\/]*\..{2,5})/i
, whoKnowsWhatItCouldBe = [
"www.mydomain.com/whatever/my-site" //matches: www
, "mydomain.com"// does not match
, "http://mydomain.com" // does not match
, "https://mydomain.com"// does not match
, "banana.com/somethingelse" // does not match
, "https://banana.com/somethingelse.org" // does not match
, "http://what-ever.mydomain.mu" //matches: what-ever
, "dev-www.thisdomain.com/whatever" // matches: dev-www
, "hot-MamaSitas.SomE_doma-in.au.xxx"//matches: hot-MamaSitas
, "http://hot-MamaSitas.SomE_doma-in.au.xxx" // matches: hot-MamaSitas
, "пуст.пустыня.ru" //even non english chars! Woohoo! matches: пуст
, "пустыня.ru" //does not match
];
// Run a loop and test it out.
for ( var i = 0, length = whoKnowsWhatItCouldBe.length; i < length; i++ ){
var result = whoKnowsWhatItCouldBe[i].match(regex);
if(result != null){
// YAY! We have a match!
} else {
// Boo... No subdomain was found
}
}
one.two
还是只返回 one
?我想我们可以调整正则表达式来提取域名之前的所有 (..) 组...也许稍后再做。 - Pandem1c(file:\/\/|http:\/\/|https:\/\/|\/\/)*(.*?)\.(?=[^\/]*\..{2,5})
。 - Wesley Smith(?:http[s]*\:\/\/)*(.*?)\.(?=[^\/]*\..{2,5})
。 - RonSomE_doma-in
是您示例的子域名,不是吗?我不清楚您期望得到什么,与您实际得到的有何不同。个人认为匹配应该是SomE_doma-in
... - Pandem1c/(http:\/\/)?(([^.]+)\.)?domain\.com/
如果提供了子域名,$3(或\3)将包含“subdomain”。
如果您希望在第一组中包含子域名,并且您的正则表达式引擎支持非捕获组(shy groups),则可以使用以下内容(由palindrom建议):
/(?:http:\/\/)?(?:([^.]+)\.)?domain\.com/
domain
是什么怎么办? - Dallas Clark仅包含子域名字符串(结果为 $1):
^http://([^.]+)\.domain\.com
http://
可选(结果为 $2):^(http://)?([^.]+)\.domain\.com
http://
和子域名可选(结果为 $3):(http://)?(([^.]+)\.)?domain\.com
它应该只是
\Qhttp://\E(\w+)\.domain\.com
#!/usr/bin/perl
use strict;
use warnings;
my $s = 'http://subdomain.example.com';
my $subdomain = (split qr{/{2}|\.}, $s)[1];
print "'$subdomain'\n";
为了处理包含点字符的数学子域,我使用了这个方法
https?:\/\/?(?:([^*]+)\.)?domain\.com
获取协议后到域名之间的所有匹配字符。
https://sub.sub.domain.com(子子域名)......
第一组
http://(.*).example.com
.*
会匹配一个空字符串,更重要的是,句点代表着任意字符。 - Sinan Ünür