Как найти подстроки без указания длины в строке в 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. Это было бы, как сказал Слизрел, излишним.

Другие вопросы по тегам