Кто-нибудь знает сценарий, который может выбирать все текстовые ссылки на URL-адреса и автоматически заменять их тегами привязки, указывающими на эти места?
For example:
http://www.google.com
would automatically turn into
<a href = "http://www.google.com">http://www.google.com</a>
Примечание. Я хочу этого, потому что не хочу просматривать весь свой контент и заключать его в теги привязки.
Я создал библиотеку, которую вы, возможно, захотите рассмотреть: ali-saleem.github.io/anchorme.js он очень маленький по размеру, очень эффективен, очень чувствителен, дает наименьшее количество ложных срабатываний, поддерживает все TLD, поддерживает IP, FTP. , HTTP или даже без http, пропускает HTML без регулярного выражения, и это в 3 раза быстрее, чем связывание и автолинковка.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


JQuery здесь не очень поможет, поскольку вас не интересует обход / манипуляции с DOM (кроме создания тега привязки). Если бы все ваши URL были в тегах <p class = "url">, возможно.
Вы, вероятно, захотите использовать ванильное JavaScript-решение, и волею судьбы этот парень должен тебя прикрыть.
Я не согласен, решение этой проблемы включает в себя много обхода DOM (возможно, не много селекторов CSS), и jQuery - прекрасный инструмент для решения этой проблемы. (См. Мой пример черновика плагина jQuery ниже.)
Я предлагаю вам сделать это на своих статических страницах перед рендерингом в браузере, иначе вы переложите бремя вычисления конверсии на своих бедных посетителей. :) Вот как это можно сделать в Ruby (чтение из стандартного ввода, запись в стандартный вывод):
while line = gets
puts line.gsub( /(^|[^"'])(http\S+)/, "\\1<a href='\\2'>\\2</a>" )
end
Очевидно, вы захотите подумать о том, как сделать это настолько надежным, насколько вы хотите. Вышеупомянутое требует, чтобы все URL-адреса начинались с http, и будет проверяться, не преобразовывать ли URL-адреса в кавычках (т.е. которые могут уже находиться внутри <a href="...">). Он не будет ловить ftp: //, mailto :. Он с радостью преобразует материал в такие места, как тела <script>, чего вы, возможно, не захотите.
Наиболее удовлетворительным решением является преобразование вручную с помощью редактора, чтобы вы могли наблюдать и одобрять все замены. Хороший редактор позволит вам выполнять замену регулярного выражения с помощью групповых ссылок (также называемых обратными ссылками), так что это не должно иметь большого значения.
Если вам нужно решение с другой точки зрения ... если вы можете запускать страницы через php и HTML Purifier, он может автоматически форматировать вывод и связывать любые URL-адреса.
ПРИМЕЧАНИЕ: Обновленная и исправленная версия этого скрипта теперь доступна по адресу https://github.com/maranomynet/linkify (лицензия GPL / MIT)
Хм ... Мне это кажется идеальной задачей для jQuery.
... что-то вроде этого пришло мне в голову:
// Define: Linkify plugin
(function($){
var url1 = /(^|<|\s)(www\..+?\..+?)(\s|>|$)/g,
url2 = /(^|<|\s)(((https?|ftp)://|mailto:).+?)(\s|>|$)/g,
linkifyThis = function () {
var childNodes = this.childNodes,
i = childNodes.length;
while(i--)
{
var n = childNodes[i];
if (n.nodeType == 3) {
var html = $.trim(n.nodeValue);
if (html)
{
html = html.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(url1, '$1<a href = "http://$2">$2</a>$3')
.replace(url2, '$1<a href = "$2">$2</a>$5');
$(n).after(html).remove();
}
}
else if (n.nodeType == 1 && !/^(a|button|textarea)$/i.test(n.tagName)) {
linkifyThis.call(n);
}
}
};
$.fn.linkify = function () {
return this.each(linkifyThis);
};
})(jQuery);
// Usage example:
jQuery('div.textbody').linkify();
Он пытается превратить все вхождения следующего в ссылки:
www.example.com/pathhttp://www.example.com/pathmailto:[email protected]ftp://www.server.com/path< ... >)Наслаждаться :-)
Незначительная синтаксическая ошибка: while (i--) {// обратите внимание на лишнюю скобку Спасибо! Этот плагин был именно тем, что я искал.
Исправлена ошибка, спасибо!
Кстати, обновленная и исправленная версия этого скрипта теперь доступна (GPL / MIT) по адресу github.com/maranomynet/linkify
прохладно!. некоторые идеи, установите целевое значение attr в параметрах и прикрепите jquery из google cdn вместо локальной копии. очень-очень полезный кусок js.
У меня были проблемы с проектом на GitHub в IE 7 и IE 8. Поэтому я отправил запрос на перенос с новым регулярным выражением. Спасибо.
Ух ты! Спасибо тебе большое за это! Я сделал небольшой jsFiddle из этого, если кто-то хочет увидеть его предварительный просмотр: jsfiddle.net/NathanJohnson/gRLaV
К сожалению, это не работает в Chrome (v27).
@ MárÖrlygsson: вы все еще поддерживаете эту библиотеку? Хотелось бы включить его в моя сводка новостей - см. билет на GitHub.
не совсем. не на данный момент по крайней мере
Не все варианты использования работают ... jsfiddle.net/npnrm8dq
Спасибо за этот полезный источник. Отлично работает для моего проекта.
Иногда это не вариант на стороне сервера. Подумайте о клиентском виджете Twitter (который напрямую переходит в Twitter API с помощью jsonp), и вы хотите динамически связать все URL-адреса в твитах ...
Взгляните на этот плагин JQuery: https://code.google.com/p/jquery-linkifier/
Этот плагин очень наивен. В нем не упоминается предшествующий уровень техники, хотя есть тонны библиотек для разбора и проверки URL-адресов.
У меня есть эта функция, которую я вызываю
textToLinks: function(text) {
var re = /(https?://(([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?))/g;
return text.replace(re, "<a href=\"$1\" title=\"\">$1</a>");
}
Является ли javascript единственной доступной для вас средой или у вас есть серверная часть, например php?