Самый простой способ преобразовать URL-адрес в гиперссылку в строке C #?
Вопрос
Я использую Twitter API и хочу преобразовать все URL-адреса в гиперссылки.
Какой наиболее эффективный способ, который вы придумали для этого?
От
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>
Решение
Регулярные выражения, вероятно, являются вашим другом для такого рода задач:
Regex r = new Regex(@"(https?://[^\s]+)");
myString = r.Replace(myString, "<a href=\"$1\">$1</a>");
Возможно, потребуется немного поработать над регулярным выражением для сопоставления URL-адресов.
Другие советы
Я проделал точно то же самое с jquery, использующий 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);
});
};
На самом деле это ужасная проблема.URL-адреса могут содержать знаки препинания (и заканчиваться на них), поэтому может быть трудно определить, где на самом деле заканчивается URL-адрес, когда он встроен в обычный текст.Например:
http://example.com/.
это допустимый URL-адрес, но с таким же успехом он может быть концом предложения:
I buy all my witty T-shirts from http://example.com/.
Вы не можете просто выполнить синтаксический анализ, пока не будет найден пробел, потому что тогда вы сохраните точку как часть URL-адреса.Вы также не можете просто выполнить синтаксический анализ, пока не будет найдена точка или пробел, потому что точки чрезвычайно распространены в URL-адресах.
Да, регулярное выражение здесь ваш друг, но создание соответствующего регулярного выражения - это сложная часть.
Проверьте и это тоже: Расширение URL-адресов с помощью регулярного выражения в .NET.
Вы можете добавить еще немного контроля над этим, используя функцию делегирования 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;
}
/болеем за Рэдвулвз
От:this.заменить(/[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/домен"."расширение и адрес любого домена".,
и это прекрасный пример для других применений манипулирования строками.вы можете нарезать кубиками по своему желанию с помощью .замените и вставьте соответствующие "a href" там, где это необходимо.
Я использовал jQuery, чтобы легко изменить атрибуты этих ссылок на "target =_blank" в моей логике загрузки контента, хотя метод .link не позволяет вам настраивать их.
Лично мне нравится привязывать пользовательский метод к объекту string для фильтрации строк "на лету" (объявление String.prototype.linkify), но я не уверен, как это будет выглядеть в крупномасштабной среде, где вам придется организовать более 10 пользовательских функций, подобных linkify.Я думаю, что на этом этапе вам определенно пришлось бы сделать что-то еще со своей структурой кода.
Может быть, сюда случайно забредет ветеринар и просветит нас.