我一生中第一次尝试为开源软件做出贡献。因此,我正试图帮助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不相同,我无法搜索指定的索引,这同样适用于客户端名称。
答案 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];