Самый простой способ конвертировать 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;
}