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

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

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

от

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

to

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

person Nathan Birkes    schedule 28.08.2008    source источник
comment
Для этого приложения вам следует искать решение, которое точно соответствует тому, как сам Twitter анализирует URL-адреса - может работать регулярное выражение; просто убедитесь, что для сопоставления конца URL-адреса используется то же условие (вместо точек и правых круглых скобок), что и в Twitter.   -  person Kevin Reid    schedule 18.04.2010


Ответы (5)


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

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

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

person samjudson    schedule 28.08.2008
comment
Я думаю, что это нормально, регулярные выражения - это мощное средство, но захват без пробелов намного лучше, чем пытаться реализовать парсер URL-адресов в регулярном выражении. Возможно, я бы изменил его на (https?://[^ ]+), потому что https - не такая уж редкость. - person John Leidegren; 18.04.2010

Я сделал то же самое с 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);
    });
 };
person RedWolves    schedule 28.08.2008

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

http://example.com/.

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

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

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

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

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

person Derek Park    schedule 28.08.2008

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

/ болеть за RedWolves

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

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

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

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

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

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

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

person winfred    schedule 18.04.2010