2014-12-06 2 views
1

Я работаю с twitter API с LinqToTwitter API. Там я пытаюсь отформатировать текст твита. Но у меня есть проблемы с заменой и регулярное выражение ниже строки, которые я получаю от твиттереReplace and RegEx issue

@TheNational: ICYMI: Louvre be first museum in Asia to show a painting http://t.co/fmp http://t.c…

Теперь я использую ниже код заменить все URL, чтобы Ссылка для отображения.

Сначала я создать регулярное выражение, чтобы получить ссылку

private readonly Regex _parseUrls = new Regex("(?<Protocol>\\w+):\\/\\/(?<Domain>[\\[email protected]][\\w.:@]+)\\/?[\\w\\.?=%&=\\[email protected]/$,]*", RegexOptions.IgnoreCase | RegexOptions.Compiled); 

Тогда я сопоставить их и заменить, как показано ниже

foreach (var urlMatch in _parseUrls.Matches(tweetText)) 
    { 
    Match match = (Match)urlMatch; 
    tweetText = tweetText.Replace(match.Value, string.Format("<a href=\"{0}\" target=\"_blank\">{0}</a>", match.Value)); 
    } 

Regex работает очень хорошо, как ожидалось, но теперь заменить дает проблему и как звено в строка начинается с http://t.co, она заменяет первое появление каждый раз.

Кто-нибудь мне помогает, что мне не хватает.

ответ

1

Это не правильный способ замены.

Используйте Regex.Replace метод:

_parseUrls.Replace(tweetText, "<a href=\"$&\" target=\"_blank\">$&</a>"); 

Или, еще лучше, с HTML-кодирования:

_parseUrls.Replace(tweetText, 
        match => string.Format("<a href=\"{0}\" target=\"_blank\">{1}</a>", 
              match.Value, 
              WebUtility.HtmlEncode(match.Value)) 
       ); 

Это будет, например, превратить любой & в URL, чтобы &amp; внутри <a> тега. Вы даже должны закодировать оставшуюся часть строки: если кто-то чётко читает какой-то HTML-код, который вы хотите отобразить как -я, вместо того, чтобы его интерпретировать.

Проблема с вашим первоначальным подходом заключается в том, что _parseUrls.Matches(tweetText) снова соответствует замененному тексту с каждой итерацией.

+0

Вы решили мою большую проблему, спасибо вам большое – Milind