2

我正在尝试解析可能包含 url 的推文。我想在推文的其余部分用不同的颜色/字体格式化 url。很明显,url 可以放在文本中的任何位置。所以我有一个看起来像这样的类别方法:

NSString *urlString = @"";
NSRange startRange = [self rangeOfString:@"http://" options:NSCaseInsensitiveSearch];

if (startRange.length) {
    NSString *subStr = [self substringFromIndex:startRange.location];
    NSCharacterSet *set = [NSCharacterSet whitespaceAndNewlineCharacterSet];
    NSRange endRange = [subStr rangeOfCharacterFromSet:set];

    if (endRange.length) {
        NSRange finalRange;
        finalRange.location = startRange.location;
        finalRange.length = endRange.location - 1;
        NSString *finalString = [self substringWithRange:finalRange];
        debugTrace(@"finalString : %@", finalString);
    }
}

return urlString;

所以基本上我在文本中找到范围,http://然后从那里到最后创建一个子字符串。从那里我寻找第一个whitespaceAndNewlineCharacterSet并将其用作 url 的结尾来查找finalString. 然而,线

NSRange endRange = [subStr rangeOfCharacterFromSet:set];

返回垃圾值,这让我觉得我没有使用正确NSCharacterSet的来找到endRange

Printing description of endRange: (NSRange) endRange = location=2147483647, length=0

我该怎么做才能找到 URL 的结束位置。

4

1 回答 1

4

正如我在评论中提到的,它不是垃圾范围值,它是NSNotFound. 这意味着您传递的字符串中没有出现任何空格或换行符(这是一个有效的情况)。因此,我们需要为此做好准备。

根据您的代码,我已将其更改为检查NSNotFound. 此外,不需要从 finalRange 长度中减去 1。当我测试这个代码示例时,它从我的 URL 字符串中裁剪了最后一个字符。注释已添加到更改/查询行的末尾。

NSString *urlString = @""; // Is this being used?
NSRange startRange = [self rangeOfString:@"http://" options:NSCaseInsensitiveSearch];

if (startRange.length) {
    NSString *subStr = [self substringFromIndex:startRange.location];
    NSCharacterSet *set = [NSCharacterSet whitespaceAndNewlineCharacterSet];
    NSRange endRange = [subStr rangeOfCharacterFromSet:set];

    if (endRange.location == NSNotFound) { // Check for NSNotFound
        debugTrace(@"finalString : %@", subStr); 
    }
    else if (endRange.length) {
        NSRange finalRange;
        finalRange.location = startRange.location;
        finalRange.length = endRange.location; // No need to subtract 1
        NSString *finalString = [self substringWithRange:finalRange];
        debugTrace(@"finalString : %@", finalString);
    }
}

return urlString;

我已经对此进行了简短的测试,它似乎有效。

于 2013-02-12T17:25:53.340 回答