2008-08-28 1 views
14

Я использую API Twitter и хочу преобразовать все URL-адреса в гиперссылки.Самый простой способ конвертировать URL-адрес в гиперссылку в строке C#?

Каков наиболее эффективный способ сделать это?

из

string myString = "This is my tweet check it out http://tinyurl.com/blah"; 

к

This is my tweet check it out <a href="http://tinyurl.com/blah">http://tinyurl.com/>blah</a> 
+0

Для этого приложения вы РЕКОМЕНДУЕМЫМ искать решение, которое точно соответствует тому, как Twitter сам анализирует URL-адреса - может работать регулярное выражение; просто убедитесь, что используете те же условия для соответствия концу URL-адреса (например, в точках и правых скобках), как это делает Twitter. – 2010-04-18 11:17:46

ответ

21

Регулярные выражения, вероятно, ваш друг для такого рода задачи:

Regex r = new Regex(@"(https?://[^\s]+)"); 
myString = r.Replace(myString, "<a href=\"$1\">$1</a>"); 

Регулярное выражение для сопоставления URL-адресов, возможно, потребуется немного Работа.

+2

Я думаю, что все в порядке, регулярные выражения являются мощными, но захватываются, а не-whitespace намного лучше, чем пытаться реализовать парсер URL в regex. Я мог бы изменить его на `(https?: // [^] +)` becuase https не так уж редко. – 2010-04-18 07:47:46

5

Это на самом деле уродливая проблема. URL-адреса могут содержать (и заканчиваться) пунктуацией, поэтому бывает сложно определить, где заканчивается URL-адрес, когда он встроен в обычный текст. Например:

http://example.com/. 

является допустимым URL, но он может так же легко быть в конце предложения:

I buy all my witty T-shirts from http://example.com/. 

Вы не можете просто разобрать, пока пространство не будет найден, потому что тогда вы Я сохраню этот период как часть URL-адреса. Вы также не можете просто анализировать до тех пор, пока не будет найден период или пробел, поскольку периоды чрезвычайно распространены в URL-адресах.

Да, regex - ваш друг здесь, но создание соответствующего регулярного выражения - трудная часть.

Отметьте это также: Expanding URLs with Regex in .NET.

+0

Это было прекрасно .. :) – TimLeung 2009-03-26 18:50:29

7

Я сделал это точно такой же, что с jquery consuming the JSON API здесь функция linkify:

String.prototype.linkify = function() { 
    return this.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/, function(m) { 
     return m.link(m); 
    }); 
}; 
1

/поболеть за RedWolves

от: this.replace (/ [A-Za-Z] + : // [A-Za-z0-9- ] + [A-Za-z0-9-:% & \ /.=]. + /, функция (м) {...

см.:/[A-Za-z] +: // [A-Za-z0-9- ] +. [A-Za-z0-9-:% & \ /.=] +/

Там в код адреса "anyprotocol":. // "anysubdomain/домен" "anydomainextension и адрес",

и это идеальный пример для других применений манипуляций с строками. вы можете нарезать кусочки и кубики по своему желанию с помощью .replace и вставить надлежащие «href», где это необходимо.

Я использовал jQuery, чтобы легко изменить атрибуты этих ссылок на «target = _blank» в моей логике загрузки контента, даже если метод .link не позволяет вам их настраивать.

Мне лично нравится привязывать к пользовательскому методу строковый объект для потоковой фильтрации (String.prototype.linkify), но я не уверен, как это будет происходить в крупномасштабной среде, где вам придется организовать более 10 пользовательских связующих функций. Я думаю, вам определенно нужно будет сделать что-то еще с вашей структурой кода в этот момент.

Возможно, ветеринар споткнется здесь и просветит нас.

1

Вы можете добавить еще некоторый контроль над этим с помощью MatchEvaluator функции делегата с регулярным выражением: Предположим, у меня есть эта строка:

find more on http://www.stackoverflow.com

Теперь попробуйте этот код

private void ModifyString() 
{ 
    string input = "find more on http://www.authorcode.com "; 
       Regex regx = new Regex(@"\b((http|https|ftp|mailto)://)?(www.)+[\w-]+(/[\w- ./?%&=]*)?"); 
       string result = regx.Replace(input, new MatchEvaluator(ReplaceURl)); 
} 

static string ReplaceURl(Match m) 
{ 
    string x = m.ToString(); 
    x = "< a href=\"" + x + "\">" + x + "</a>"; 
    return x; 
} 
Смежные вопросы