我正在尝试解析可能包含网址的推文。我想在推文的其余部分中使用不同的颜色/字体格式化网址。很明显,网址可以放在文本的任何位置。所以我有一个看起来像这样的类别方法:
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
我如何解决这个问题,以便找到网址的结束位置。
答案 0 :(得分: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;
我已经对此进行了简要测试,似乎有效。