Как найти подстроки без указания длины в строке в Objective-C?
Я впервые в жизни пытаюсь внести свой вклад в программное обеспечение с открытым исходным кодом. Поэтому я пытаюсь помочь с этим билетом, так как он кажется хорошим "билетом для начинающих".
Я успешно получил строку из 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 ответа
Предполагая, что у вас уже есть 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];
Вы знаете, что эта часть строки будет одинаковой:
<a href="...">...</a>
так что вы действительно хотите, чтобы поиск к первому "и закрытие >
для начала a
тег.
Самый простой способ сделать это - найти то, что находится в кавычках (см. Эту ссылку для поиска NSStrings), а затем получить текст после второй до последней >
для вашего настоящего имени.
Вы также можете использовать NSXMLParser, так как он работает именно с XML, но в этом случае это может оказаться излишним.
Я не смотрел на источник Adium, но вы должны проверить, есть ли какие-либо категории, которые расширяют, например, NSString
с методами синтаксического анализа html/xml для более удобных структур, таких как дерево узлов, например. Тогда вы можете просто пройтись по дереву и найти необходимые атрибуты.
Если нет, вы можете либо разобрать его самостоятельно, разделив строку на токены (тег open, тег tag, атрибуты tag, строки в кавычках и т. Д.), А затем найдите необходимые атрибуты. В качестве альтернативы вы можете даже использовать регулярное выражение, если строки всегда состоят из одного элемента привязки html.
Я знаю, что много раз обсуждалось, что регулярные выражения просто не работают для разбора html, но это особый сценарий, в котором это действительно разумно. Лучше, чем запуск полноценного парсера html/xml. Это было бы, как сказал Слизрел, излишним.