NSRegularExpression: заменить текст URL тегами <a> - PullRequest
9 голосов
/ 06 мая 2011

В настоящее время я использую UIWebView для стилизации постов из твиттера.Конечно, некоторые твиты содержат URL-адреса, но не содержат тегов <a>.Я могу вытащить URL-адрес, однако я не уверен, как добавить теги <a> и поместить его обратно в твит.Затем я буду использовать тот же подход, чтобы добавить ссылки на @usernames и #hashtags.Вот пример моего текущего кода:

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((?:[a-z][\\w-]+:(?:/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{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

В конечном счете, я бы хотел, чтобы окончательная строка выглядела так:

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>

Любая помощь будетвысоко ценится.

Ответы [ 2 ]

15 голосов
/ 06 мая 2011

А вот версия target-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);

Я делал что-то подобное раньше, но для этого использовал javascript.Когда представление загружено, используйте метод делегата webViewDidFinishLoad и введите 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];
} 

Вот вызов javascript в версии кавычек нецелевой строки:

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

Регулярное выражение не идеально, но поймает большинство ссылок.

0 голосов
/ 06 мая 2011

Вы можете использовать stringByReplacingOccurrencesOfString:withString: для поиска вашего match и заменить его ссылкой HTML.

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

(Вы можете также использовать диапазон, который вы получаете отrangeOfFirstMatchInString:options:range в stringByReplacingCharactersInRange:withString:, но я не уверен, что произойдет, если вы передадите строку, которая в этом случае длиннее длины диапазонов).

Обратите внимание, что при поиске будет найдена только первая ссылка в твите,и если есть несколько матчей, вы пропустите их.

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