Самый простой способ конвертировать URL-адрес в гиперссылку в строке С#?

Я использую API Twitter и хочу конвертировать все URL-адреса в гиперссылки.

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

от

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

к

This is my tweet check it out <a href="#" onclick="location.href='http://tinyurl.com/blah'; return false;">http://tinyurl.com/>blah</a>

Ответы

Ответ 1

Регулярные выражения, вероятно, являются вашим другом для этой задачи:

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

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

Ответ 2

Я сделал то же самое с jquery, использующий JSON API, вот ссылка:

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

Ответ 3

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

http://example.com/.

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

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

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

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

Посмотрите также: Расширение URL-адресов с помощью Regex в .NET.

Ответ 4

/cheer для RedWolves

from: this.replace(/[A-Za-z] +://[A-Za-z0-9-]+. [A-Za-z0-9 -:% & \?/. =] +/, функция (m) {...

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

Вот код для адресов "anyprotocol":// "anysubdomain/domain". "anydomainextension and address",

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

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

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

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

Ответ 5

Вы можете добавить еще один контроль над этим, используя функцию делегата 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;
}