21

我最近在比较两个 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"]]

它仍然给我“http://m.google.com/” absoluteString,我想知道是否有任何可靠的方法可以与 NSURL 或一个 NSURL 和一个 NSString 进行比较?

  1. 检查一个是否“包含”另一个,但这不可靠,因为“http://m.google.com/blabla”包含“http://m.google.com”。

  2. 将 NSString 转换为 NSURL 并使用该isEqual方法比较两个 NSURL 并希望 NSURL 的实现isEqual可以弄清楚吗?

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

非常感谢!

4

4 回答 4

28

如果您只关心斜杠的歧义,您可以通过知道 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;
}
于 2012-09-08T15:39:32.500 回答
2

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

我想推荐以下内容。

if ([[url1 absoluteString] isEqualToString:[url2 absoluteString]]) 
{
   //Add your implementation here
}
于 2017-06-09T09:40:05.193 回答
2

最近遇到了[NSURL isEqual]在比较两个 URL 时方法返回 false的情况https://www.google.com/https://www.google.com我发现将URLByAppendingPathComponent带有空字符串的参数应用到两个 URL 将返回正确的结果。

所以像:

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

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

在我看来,我似乎是在依靠一种奇怪的行为来解决另一种奇怪的行为,但这就是我要做的事情,除非我能以其他方式说服我 ;-)。

于 2019-01-15T00:34:38.897 回答
-10

简单的方法是:

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

所以你与 NSString 方法 isEqual 进行比较:

BOOL equalty=[urlString isEqual:anotherNSString];

XD

于 2012-12-19T19:53:02.150 回答