2010-11-22 4 views
0

J'essaie, pour la première fois de ma vie, de contribuer au logiciel open source. Par conséquent, j'essaie d'aider sur this ticket, car il semble être un bon "ticket débutant".Comment trouver des sous-chaînes non spécifiées en longueur dans une chaîne en Objective-C?

j'ai obtenu avec succès la chaîne de l'API Twitter: cependant, il est dans ce format:

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

Ce que je veux extraire de cette chaîne est l'URL (http://twitter.com) et le nom du Client Twitter (Tweetie for Mac). Comment puis-je faire cela en Objective-C? Comme les URL ne sont pas les mêmes, je ne peux pas rechercher un index spécifié, et il en va de même pour le nom du client.

Répondre

1

En supposant que vous ayez déjà le lien HTML et que vous n'analysiez pas une page HTML entière.

//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]; 
+0

Merci, ça a l'air vraiment sympa. Je jetterai un coup d'œil à la documentation pour comprendre ce que vous faites et apprendre quelque chose, et pas seulement pour copier-coller, lol. – Saser

+0

Si cela aide à marquer comme la réponse. Faites-moi savoir si cela ne fonctionne pas pour vous. – aahrens

+0

Il aide, et fonctionne correctement avec quelques petites modifications. Marquage comme réponse. Cependant, cela cause-t-il des fuites de mémoire ou quelque chose comme ça? Parce que je remarque que mon MacBook fonctionne beaucoup plus lentement lorsque vous utilisez Adium avec ce code. – Saser

1

vous savez que cette partie de la chaîne sera le même:.

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

donc ce que vous voulez vraiment est une recherche au premier "et la fermeture > pour le début de la balise a

la meilleure façon de le faire serait de trouver ce qui est dans les citations (voir this link pour savoir comment rechercher NSStrings) puis obtenir le texte après la deuxième à la dernière > pour votre nom réel.

Vous pouvez également utiliser un NSXMLParser car cela fonctionne spécifiquement avec XML, mais cela peut être exagéré dans ce cas.

1

Je n'ai pas examiné la source Adium mais vous devez vérifier s'il existe des catégories disponibles qui s'étendent par exemple. NSString avec des méthodes pour analyser html/xml à des structures plus utilisables, comme un arbre de nœuds par exemple. Ensuite, vous pouvez simplement parcourir l'arbre et rechercher les attributs requis. Si ce n'est pas le cas, vous pouvez l'analyser vous-même en divisant la chaîne en jetons (balise open, tag close, attributs de balise, chaînes de caractères entre guillemets, etc.), puis recherchez les attributs requis. Vous pouvez également utiliser une expression régulière si les chaînes sont toujours constituées d'un seul élément d'ancrage html.

Je sais qu'il a été discuté à plusieurs reprises que les expressions régulières ne fonctionnent tout simplement pas pour l'analyse html, mais c'est un scénario spécifique où c'est réellement raisonnable. Mieux que d'exécuter un analyseur html/xml générique complet. Ce serait, comme l'a dit slycrel, une surpêche.

+0

D'accord - et un problème similaire peut avoir été résolu à un moment donné du projet. Trouver quelque chose de similaire vous donnerait de l'inspiration et vous aiderait à correspondre à leur style. –

Questions connexes