比较两个NSURL或一个NSURL和一个NSString的可靠方法?

时间:2012-09-07 00:33:47

标签: objective-c uiwebview nsstring nsurl nsurlrequest

我最近在比较两个NSURL并将一个NSURL与一个NSString(一个URL地址)进行比较时遇到了问题,情况是我从某个地方得到了NSURLRequest,我可能知道也可能不知道它指向的URL地址,我有一个URL NSString,比如“http://m.google.com”,现在我需要检查NSURLRequest中的URL是否与我的URL字符串相同:

[[request.URL.absoluteString lowercaseString] isEqualToString: [self.myAddress lowercaseString]];

这会返回NO,因为absoluteString给了我“http://m.google.com/”,而我的字符串是“http://m.google.com”,最后没有斜线,甚至如果我使用

创建NSURLRequest
[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://m.google.com"]]

它仍然为absoluteString提供了“http://m.google.com/”,我想知道有没有可靠的方法来与NSURL或一个NSURL和一个NSString进行比较?

  1. 检查一个“包含”其他内容,但这不可靠,因为“http://m.google.com/blabla”包含“http://m.google.com”。

  2. 将NSString转换为NSURL并使用isEqual方法比较两个NSURL,希望NSURL的isEqual实现可以解决这个问题吗?

  3. 基于第2步,但使用standardizedURL将每个NSURL转换为标准网址?

  4. 非常感谢!

4 个答案:

答案 0 :(得分:29)

如果你只关心斜杠的模糊性,你可以通过知道NSURL路径修剪尾部斜线来快速省去这个问题。

但是我喜欢NSURL上的类别方法的想法,它实现了一些基于标准的等价(在这种情况下,“等价”可能是比平等更好的术语)。

@RobNapier是指一个相关的问题,其答案很好,指向RFC2616。 url语法的另一个相关标准是RFC1808

困难的部分是决定等价的含义,例如,不同的查询或片段(锚链接)怎么样?下面的代码在大多数这些含糊不清的情况下都是错误的......

// in NSURL+uriEquivalence.m

- (BOOL)isEquivalent:(NSURL *)aURL {

    if ([self isEqual:aURL]) return YES;
    if ([[self scheme] caseInsensitiveCompare:[aURL scheme]] != NSOrderedSame) return NO;
    if ([[self host] caseInsensitiveCompare:[aURL host]] != NSOrderedSame) return NO;

    // NSURL path is smart about trimming trailing slashes
    // note case-sensitivty here
    if ([[self path] compare:[aURL path]] != NSOrderedSame) return NO;

    // at this point, we've established that the urls are equivalent according to the rfc
    // insofar as scheme, host, and paths match

    // according to rfc2616, port's can weakly match if one is missing and the
    // other is default for the scheme, but for now, let's insist on an explicit match
    if ([self port] || [aURL port]) {
        if (![[self port] isEqual:[aURL port]]) return NO;
        if (![[self query] isEqual:[aURL query]]) return NO;
    }

    // for things like user/pw, fragment, etc., seems sensible to be
    // permissive about these.
    return YES;
}

答案 1 :(得分:3)

我知道这是回答的。但我不认为,它很清楚。

我想推荐以下内容。

if ([[url1 absoluteString] isEqualToString:[url2 absoluteString]]) 
{
   //Add your implementation here
}

答案 2 :(得分:1)

最近遇到一种情况,当比较两个[NSURL isEqual]https://www.google.com/之类的URL时,https://www.google.com方法返回false我发现用空字符串应用URLByAppendingPathComponent作为两个URL的参数将返回正确的结果。

类似这样:

[[urlOne URLByAppendingPathComponent:@""] isEqual:[urlTwo URLByAppendingPathComponent:@""]]

如果缺少则添加斜杠,如果已经包含斜杠则将其保留,因此比较将按预期进行。

在我看来,就像我要依靠一种奇怪的行为来解决另一种奇怪的行为一样,但这就是我要解决的问题,除非可以确信我否则;-)。

答案 3 :(得分:-8)

简单方法是:

NSString*urlString=[NSString stringWithFormat:@"%@",request.URL];

所以你要比较NSString方法isEqual:

BOOL equalty=[urlString isEqual:anotherNSString];

XD