是否有可能从NSURL获得域名和TLD? 没有www或其他什么?

假设我有http://www.youtube.com : http://youtube.comhttps://www1.youtube.com/moretext 。 如何编写一个支票来查看所有这些url是否来自youtube.com?

我试过url.host ,它似乎保持www. 什么都不是,这不是我想要的。

我基本上只是想能够说:

 if ([url isFromWebsite:@"youtube.com"]) { // Do things. } 

这可能吗?

这是NSURL上未经testing的类别,将提供您想要的方法。

 @implementation NSURL (IsFromWebsite) - (BOOL) isFromWebsite:(NSString *)domain { NSArray *selfHostComponents = [[self host] componentsSeparatedByString:@"."]; NSArray *targetHostComponents = [domain componentsSeparatedByString:@"."]; NSInteger selfComponentsCount = [selfHostComponents count]; NSInteger targetComponentsCount = [targetHostComponents count]; NSInteger offset = selfComponentsCount - targetComponentsCount; if (offset < 0) return NO; for (NSUInteger i = offset; i < selfComponentsCount; i++) { if (![selfHostComponents[i] isEqualToString:targetHostComponents[i - offset]]) return NO; } return YES; } @end 

编辑:另一个(也未经testing)的方式来做同样的事情,正如Jesse Rusak所build议的:

 @implementation NSURL (IsFromWebsite) - (BOOL) isFromWebsite:(NSString *)domain { NSArray *selfComponents = [[self host] componentsSeparatedByString:@"."]; NSArray *targetComponents = [domain componentsSeparatedByString:@"."]; NSInteger sizeDifference = [selfComponents count] - [targetComponents count]; if (sizeDifference < 0) return NO; return [[selfComponents subarrayWithRange:NSMakeRange(sizeDifference, [targetComponents count])] isEqualToArray:targetComponents]; } @end 

NSURL (实际上是URL)通常不会太在意URL的主机部分的实际内容; 这是由客户来解释和处理。 所以这是由你自己处理这个信息。

这是一个很好的简单方法:

 - (BOOL)isYouTubeURL:(NSURL *)url; { NSString *host = url.host; // Test the simple case of the domain being a direct match // Case-insensitive, as domain names are defined to be if ([host caseInsensitiveCompare:@"youtube.com"] == NSOrderedSame) { return YES; } // And now the more complex case of a subdomain // Look back from just the end of the string NSStringCompareOptions options = NSBackwardsSearch|NSAnchoredSearch|NSCaseInsensitiveSearch; NSRange range = [host rangeOfString:@".youtube.com" options:options]; return (range.location != NSNotFound); } 

如果需要,可以通过仅search域,然后查看前一个字符是否不存在(上面的情况#1),或者有一个. 在它之前(上面的情况#2)。 更进一步, CFURL有API告诉你主机所在的原始string在哪里,并可以直接通过它进行search。

如果有人在斯威夫特3需要bdesham的回答。

 extension URL { func isFromWebsite(domain: String) -> Bool { var selfHostComponents = self.host!.components(separatedBy: ".") var targetHostComponents = domain.components(separatedBy: ".") let selfComponentsCount = selfHostComponents.count let targetComponentsCount = targetHostComponents.count let offset = selfComponentsCount - targetComponentsCount if offset < 0 { return false } for i in offset..<selfComponentsCount { if !(selfHostComponents[i] == targetHostComponents[i - offset]) { return false } } return true } } 

您可以使用下面的代码作为NSString类别

 - (BOOL)isFromWebsite: (NSString *)website { NSRange searchResult = [self rangeOfString:website]; if (searchResult.location != NSNotFound) { return YES; } return NO; } 

如果这是一个用例,你也可以使用不区分大小写的比较。 希望这可以帮助。