NSRegularExpression: Reemplace el text de URL con tags <a>

Actualmente estoy usando una UIWebView para estilizar posts de twitter. Algunos tweets por supuesto contienen URL, pero no contienen las tags <a> . Soy capaz de extraer la URL, pero no estoy seguro de cómo agregar las tags <a> y volver a colocarlas en el tuit. Luego usaré el mismo enfoque aquí para agregar enlaces a los @usernames y #hashtags. Aquí hay un ejemplo de mi código actual:

 NSString *tweet = @"Sync your files to your Google Docs with a folder on your desktop. Like Dropbox. Good choice, Google storage is cheap. http://ow.ly/4OaOo"; NSRegularExpression *expression = [NSRegularExpression regularExpressionWithPattern:@"(?i)\\b((?:[az][\\w-]+:(?:/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][az]{2,4}/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”'']))" options:NSRegularExpressionCaseInsensitive error:NULL]; NSString *match = [tweet substringWithRange:[expression rangeOfFirstMatchInString:tweet options:NSMatchingCompleted range:NSMakeRange(0, [tweet length])]]; NSLog(@"%@", match);// == http://ow.ly/4OaOo 

En última instancia, me gustaría que la secuencia final se viera así:

Sync your files to your Google Docs with a folder on your desktop. Like Dropbox. Good choice, Google storage is cheap. <a href="http://ow.ly/4OaOo>http://ow.ly/4OaOo</a>

Cualquier ayuda sería muy apreciada.

Y aquí hay una versión de objective-c:

 NSString *regexToReplaceRawLinks = @"(\\b(https?):\\/\\/[-A-Z0-9+&@#\\/%?=~_|!:,.;]*[-A-Z0-9+&@#\\/%=~_|])"; NSError *error = NULL; NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regexToReplaceRawLinks options:NSRegularExpressionCaseInsensitive error:&error]; NSString *string = @"Sync your files to your Google Docs with a folder on your desktop. Like Dropbox. Good choice, Google storage is cheap. http://ow.ly/4OaOo"; NSString *modifiedString = [regex stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0, [string length]) withTemplate:@"<a href=\"$1\">$1</a>"]; NSLog(@"%@", modifiedString); 

Hice algo como esto antes, pero utilicé javascript para hacerlo. Cuando la vista se haya cargado, use el método de delegado webViewDidFinishLoad e inyecte javascript:

 - (void)webViewDidFinishLoad:(UIWebView *)webView { NSString *jsReplaceLinkCode = @"document.body.innerHTML = " @"document.body.innerHTML.replace(" @"/(\\b(https?):\\/\\/[-A-Z0-9+&@#\\/%?=~_|!:,.;]*[-A-Z0-9+&@#\\/%=~_|])/ig, " @"\"<a href='$1'>$1</a>\"" @");"; [webVew stringByEvaluatingJavaScriptFromString:jsReplaceLinkCode]; } 

Aquí está la llamada de javascript en una versión de comillas nsstring no objetiva:

 document.body.innerHTML = document.body.innerHTML.replace( /(\b(https?):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig, "<a href='document.location=$1'>$1</a>" ); 

La expresión regular no es perfecta, pero capturará la mayoría de los enlaces.

Puede usar stringByReplacingOccurrencesOfString:withString: para search su match y replacela por el enlace HTML.

 NSString *htmlTweet = [tweet stringByReplacingOccurrencesOfString:match withString:html]; 

(También puede usar el range que obtiene de rangeOfFirstMatchInString:options:range in stringByReplacingCharactersInRange:withString: pero no estoy seguro de qué sucede, usted pasa una cadena que es más larga que la longitud de los ranges en este caso).

Tenga en count que su búsqueda solo encontrará el primer enlace en un tuit, y si hay varias coincidencias, los extrañará.