2015-06-09 8 views
21

Prima di tutto, non ho il controllo sul testo che sto ottenendo. Volevo solo metterlo fuori così sai che non posso cambiare i link.È possibile rilevare i collegamenti all'interno di una NSString che ha spazi in essi con NSDataDetector?

Il testo che sto cercando di trovare i link a usando NSDataDetector contiene quanto segue:

<h1>My main item</h1> 
<img src="http://www.blah.com/My First Image Here.jpg"> 
<h2>Some extra data</h2> 

Il codice di rilevamento che sto usando è questo, ma non troverà questo link:

NSDataDetector *linkDetector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:nil]; 
NSArray *matches = [linkDetector matchesInString:myHTML options:0 range:NSMakeRange(0, [myHTML length])]; 

for (NSTextCheckingResult *match in matches) 
{ 
    if ([match resultType] == NSTextCheckingTypeLink) 
    { 
     NSURL *url = [match URL]; 
     // does some stuff 
    } 
} 

Si tratta di un bug con il rilevamento dei link di Apple qui, in cui non è in grado di rilevare i collegamenti con spazi o sto facendo qualcosa di sbagliato?

Qualcuno ha un modo più affidabile per rilevare i collegamenti indipendentemente dal fatto che abbiano spazi o caratteri speciali o altro?

+0

Che dire dell'espressione regolare; per esempio. 'regularExpressionWithPattern: @" src = (\ "| ') (. *) (\" |')> "' e poi '[match rangeAtIndex: 2]' – VolenD

risposta

0

È possibile suddividere le stringhe in pezzi utilizzando gli spazi in modo da disporre di una serie di stringhe senza spazi. Quindi è possibile alimentare ciascuna di queste stringhe nel rilevatore di dati.

// assume str = <img src="http://www.blah.com/My First Image Here.jpg"> 
NSArray *components = [str componentsSeparatedByString:@" "]; 
for (NSString *strWithNoSpace in components) { 
    // feed strings into data detector 
} 

Un'altra alternativa è cercare specificamente il tag HTML. Questa è una soluzione meno generica, però.

// assume that those 3 HTML strings are in a string array called strArray 
for (NSString *htmlLine in strArray) { 
    if ([[htmlLine substringWithRange:NSMakeRange(0, 8)] isEqualToString:@"<img src"]) { 
     // Get the url from the img src tag 
     NSString *urlString = [htmlLine substringWithRange:NSMakeRange(10, htmlLine.length - 12)]; 
    } 
} 
+0

Questo deve essere dinamico, non solo codificato per questo URL . Potrebbero esserci più URL di lunghezze diverse in questa stringa e tutti potrebbero contenere degli spazi. –

0

Ho trovato un modo molto hacky per risolvere il mio problema. Se qualcuno presenta una soluzione migliore che può essere applicata a tutti gli URL, per favore fallo.

Poiché mi interessa solo gli URL che terminano con .jpg e presentano questo problema, sono riuscito a trovare un modo stretto per rintracciarlo.

In sostanza, suddivido la stringa in componenti basati su di essi che iniziano con "http:// in un array. Quindi eseguo il loop di quell'array facendo un'altra interruzione alla ricerca di .jpg">. Il conteggio dell'array interno sarà solo > 1 quando viene trovata la stringa .jpg">. Conservo quindi sia la stringa che trovo, sia la stringa che risolvo con le sostituzioni %20 e le uso per eseguire una sostituzione di stringa finale sulla stringa originale.

Non è perfetto e probabilmente inefficiente, ma fa il lavoro per quello di cui ho bisogno.

- (NSString *)replaceSpacesInJpegURLs:(NSString *)htmlString 
{ 
    NSString *newString = htmlString; 

    NSArray *array = [htmlString componentsSeparatedByString:@"\"http://"]; 
    for (NSString *str in array) 
    { 
     NSArray *array2 = [str componentsSeparatedByString:@".jpg\""]; 

     if ([array2 count] > 1) 
     { 
      NSString *stringToFix = [array2 objectAtIndex:0]; 
      NSString *fixedString = [stringToFix stringByReplacingOccurrencesOfString:@" " withString:@"%20"]; 

      newString = [newString stringByReplacingOccurrencesOfString:stringToFix withString:fixedString]; 
     } 
    } 

    return newString; 
} 
-1

Non utilizzare NSDataDetector con HTML. È inteso per analizzare il testo normale (inserito da un utente), non i dati generati dal computer (in effetti, ha molte euristiche per assicurarsi che non rilevi cose generate dal computer che probabilmente non sono rilevanti per l'utente).

Se la stringa è HTML, è necessario utilizzare una libreria di analisi HTML. Ci sono un certo numero di kit open source per aiutarti a farlo. Quindi, acquisisci gli attributi href delle tue ancore o esegui NSDataDetector sui nodi di testo per trovare le cose non marcate senza inquinare la stringa con i tag.

+1

Apprezzo la risposta, ma puoi mostrarmi in alcuni documenti in cui si dice che 'NSDataDetector' non dovrebbe essere usato su HTML? Solo così so che questo è vero. –

+4

Questa risposta è davvero buona ... ma penso che tu non sappia che tipo di impressione hai fatto con il tuo ultimo commento. –

+2

Dato che lavori in Apple, ti chiedo gentilmente di ottenere i documenti aggiornati per riflettere i dettagli nella tua risposta. Non avevo idea che NSDataDetector fosse "destinato all'analisi del testo normale" (qualunque sia il "normale") e "ha molte euristiche per assicurarsi che non rilevi cose generate dal computer", che Apple non ha descritto cosa significhi realmente o ... che cos'è una "cosa generata dal computer"? Per favore, metti questo sulla tua documentazione ragazzi. Ho sprecato ore su questo quando i documenti giusti mi avrebbero salvato. –

-1

Gli URL non dovrebbero contenere spazi.Mi piacerebbe rimuovere tutti gli spazi dalla stringa prima di fare qualsiasi URL in relazione con esso, qualcosa come il seguente

// Custom function which cleans up strings ready to be used for URLs 
func cleanStringForURL(string: NSString) -> NSString { 
    var temp = string 
    var clean = string.stringByReplacingOccurrencesOfString(" ", withString: "") 
    return clean 
} 
+0

No can do ... la stringa è un'enorme pagina HTML. Non riesco a rimuovere tutti gli spazi nell'intera pagina. Ho bisogno di questo corretto solo per gli URL. Inoltre, molti siti Web hanno URL con spazi in essi, indipendentemente dal fatto che non dovrebbero o meno. Nel mio caso, non posso controllare la fonte dell'HTML. –

0

È possibile utilizzare NSRegularExpression per correggere tutti gli URL utilizzando un semplice regex per individuare i link e poi basta codificare gli spazi (se hai bisogno di una codifica più complessa puoi guardare in CFURLCreateStringByAddingPercentEscapes e ci sono un sacco di esempi là fuori). L'unica cosa che potrebbe richiedere un certo tempo se non hai lavorato con NSRegularExpression prima è come iterare i risultati e fare la sostituzione, il seguente codice dovrebbe fare il trucco:

NSError *error = NULL; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"src=\".*\"" options:NSRegularExpressionCaseInsensitive error:&error]; 
if (!error) 
{ 
    NSInteger offset = 0; 
    NSArray *matches = [regex matchesInString:myHTML options:0 range:NSMakeRange(0, [myHTML length])]; 
    for (NSTextCheckingResult *result in matches) 
    { 
     NSRange resultRange = [result range]; 
     resultRange.location += offset; 

     NSString *match = [regex replacementStringForResult:result inString:myHTML offset:offset template:@"$0"]; 
     NSString *replacement = [match stringByReplacingOccurrencesOfString:@" " withString:@"%20"]; 

     myHTML = [myHTML stringByReplacingCharactersInRange:resultRange withString:replacement]; 
     offset += ([replacement length] - resultRange.length); 
    } 
} 
4

Ho appena ricevuto questa risposta da Apple per un bug su questo:

Riteniamo che questo problema sia stato risolto nell'ultima versione di iOS 9 beta. Questo è un aggiornamento di iOS 9 pre-release.

Fare riferimento alle note sulla versione per l'installazione completa delle istruzioni .

Per favore prova con questa versione. Se hai ancora problemi, ti preghiamo di contattare per accedere a qualsiasi registro o informazione pertinente che possa aiutarci a risolvere .

iOS 9 https://developer.apple.com/ios/download/

mi metterà alla prova e farvi sapere se questo è fissato con iOS 9.

0

Prova questo schema di espressione regolare:@"<img[^>]+src=(\"|')([^\"']+)(\"|')[^>]*>" con ignorare caso ... Indice Partita = 2 per l'URL di origine.

regex demo in javascript: (Prova per qualsiasi aiuto)

Demo

0

Dare a questo frammento di una prova (ho ottenuto il regexp dal tuo primo user3584460 commentatore):

NSError *error = NULL; 
NSString *myHTML = @"<http><h1>My main item</h1><img src=\"http://www.blah.com/My First Image Here.jpg\"><h2>Some extra data</h2><img src=\"http://www.bloh.com/My Second Image Here.jpg\"><h3>Some extra data</h3><img src=\"http://www.bluh.com/My Third-Image Here.jpg\"></http>"; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"src=[\"'](.+?)[\"'].*?>" options:NSRegularExpressionCaseInsensitive error:&error]; 

NSArray *arrayOfAllMatches = [regex matchesInString:myHTML options:0 range:NSMakeRange(0, [myHTML length])]; 

NSTextCheckingResult *match = [regex firstMatchInString:myHTML options:0 range:NSMakeRange(0, myHTML.length)]; 



for (NSTextCheckingResult *match in arrayOfAllMatches) { 
    NSRange range = [match rangeAtIndex:1]; 

    NSString* substringForMatch = [myHTML substringWithRange:range]; 
    NSLog(@"Extracted URL : %@",substringForMatch); 

} 

Nel mio registro, ho:

Extracted URL : http://www.blah.com/My First Image Here.jpg 
Extracted URL : http://www.bloh.com/My Second Image Here.jpg 
Extracted URL : http://www.bluh.com/My Third-Image Here.jpg 
Problemi correlati