如何在Objective-C中的字符串中找到非长度指定的子字符串?

时间:2010-11-22 20:33:41

标签: objective-c string substring

我一生中第一次尝试为开源软件做出贡献。因此,我正试图帮助this ticket,因为它似乎是一张很好的“初学者票”。

我已成功从Twitter API获取字符串:但是,它采用以下格式:

<a href="http://twitter.com" rel="nofollow">Tweetie for Mac</a>

我想从此字符串中提取的是URL(http://twitter.com)和Twitter客户端的名称(Tweetie for Mac)。我怎么能在Objective-C中做到这一点?由于URL不相同,我无法搜索指定的索引,这同样适用于客户端名称。

3 个答案:

答案 0 :(得分:1)

你知道这部分字符串是相同的:

<a href="...">...</a>

所以你真正想要的是搜索>标签的第一个“和结束a

执行此操作的最简单方法是查找引号中的内容(有关如何搜索NSStrings,请参阅this link),然后在倒数第二个>之后获取实际名称的文本

你也可以使用NSXMLParser,因为它特别适用于XML,但对于这种情况可能有点过分。

答案 1 :(得分:1)

我没有看过Adium来源,但您应该检查是否有任何可用的类别延伸,例如NSString用于将html / xml解析为更多可用结构的方法,例如节点树。然后,您可以简单地遍历树并搜索所需的属性。

如果没有,您可以通过将字符串分为标记(标记打开,标记关闭,标记属性,引用字符串等)来自行解析,然后查找所需的属性。或者,如果字符串始终由单个html锚元素组成,您甚至可以使用正则表达式。

我知道有很多次讨论过正则表达式根本不适用于html解析,但这是一个特定的场景,它实际上是合理的。比运行一个完整的通用html / xml解析器更好。正如slycrel所说,这将是一种过度杀伤。

答案 2 :(得分:1)

假设您已经拥有HTML链接,并且没有解析整个HTML页面。

//Your HTML Link
NSString *link = [urlstring text];

//Length of HTML href Link
int length = [link length];

//Range of the first quote
NSRange firstQuote = [link rangeOfString:@"\""];

//Subrange to search for another quote in the HTML href link
NSRange nextQuote = NSMakeRange(firstQuote.location+1, length-firstQuote.location-1);

//Range of the second quote after the first
NSRange secondQuote = [link rangeOfString:@"\"" options:NSCaseInsensitiveSearch range:nextQuote];

//Extracts the http://twitter.com
NSRange urlRange = NSMakeRange(firstQuote.location+1, (secondQuote.location-1) - (firstQuote.location));
NSString *url = [link substringWithRange:urlRange];

//Gets the > right before Tweetie for Mac
NSRange firstCaret = [link rangeOfString:@">"];

//This appears at the start of the href link, we want the next one
NSRange firstClosedCaret = [link rangeOfString:@"<"];
NSRange nextClosedCaret = NSMakeRange(firstClosedCaret.location+1, length-firstClosedCaret.location-1);

//Gets the < right after Tweetie for Mac
NSRange secondClosedCaret = [link rangeOfString:@"<" options:NSCaseInsensitiveSearch range:nextClosedCaret];

//Range of the twitter client
NSRange rangeOfTwitterClient = NSMakeRange(firstCaret.location+1, (secondClosedCaret.location-1)-(firstCaret.location));
NSString *twitterClient = [link substringWithRange:rangeOfTwitterClient];