Как найти подстроки без заданной длины в строке в Objective-C? - PullRequest
0 голосов
/ 22 ноября 2010

Я впервые в жизни пытаюсь внести свой вклад в программное обеспечение с открытым исходным кодом. Поэтому я пытаюсь помочь с этим билетом , так как он кажется хорошим "билетом для начинающих".

Я успешно получил строку из 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 ]

1 голос
/ 22 ноября 2010

Я не смотрел на исходный код Adium, но вы должны проверить, есть ли какие-либо доступные категории, например, NSString с методами для разбора html / xml на более удобные для использования структуры, такие как дерево узлов, например.Затем вы можете просто пройтись по дереву и найти требуемые атрибуты.

Если нет, вы можете либо разобрать его самостоятельно, разделив строку на токены (tag open, tag close, атрибуты tag, строки в кавычках и т. Д.), затем найдите необходимые атрибуты.В качестве альтернативы вы могли бы даже использовать регулярное выражение, если строки всегда состоят из одного элемента привязки html.

Я знаю, что много раз обсуждалось, что регулярные выражения просто не работают для разбора html, но это особыйсценарий, где это на самом деле разумно.Лучше, чем запуск полноценного парсера html / xml.Это было бы, как сказал Слизрел, излишним.

1 голос
/ 23 ноября 2010

Если у вас уже есть 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];
1 голос
/ 22 ноября 2010

вы знаете, что эта часть строки будет такой же:

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

так, что вы действительно хотите, это поиск первого "и закрывающий > для начала тега a.

Самый простой способ сделать это - найти то, что находится в кавычках (см. эту ссылку о том, как искать строки NSS), а затем получить текст после второй до последней > для вашего фактического имя.

Вы также можете использовать NSXMLParser , поскольку он работает конкретно с XML, но в этом случае это может быть излишним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...