Я использую функцию ниже, чтобы сопоставить URL-адреса внутри данного текста и заменить их для ссылок HTML. Регулярное выражение работает отлично, но в настоящее время я заменяю только первое совпадение.
Как я могу заменить все URL? Я думаю, что я должен использовать команду exec , но я не совсем понял, как это сделать.
function replaceURLWithHTMLLinks(text) {
var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/i;
return text.replace(exp,"<a href='$1'>$1</a>");
}
источник
URL regexp from Component
не прокомментировали, какое-то объяснение того, что он делает, было бы полезно.Autolinker.js
очень хорошо прокомментирован и имеет тесты.urlize.js
Библиотека связана в ответе Vebjørn Ljosa в тоже выглядит и функциональной хорошо поддерживаются, хотя он не имеет тестов.Замена URL-адресов ссылками (Ответ на общую проблему)
Регулярное выражение в вопросе пропускает множество крайних случаев. При обнаружении URL-адресов всегда лучше использовать специализированную библиотеку, которая обрабатывает международные доменные имена, такие как новые TLD
.museum
, круглые скобки и другие знаки препинания внутри и в конце URL-адреса и многие другие крайние случаи. См. Сообщение в блоге Джеффа Этвуда « Проблема с URL» для объяснения некоторых других проблем.«Сделать регулярное выражение заменяющим более одного совпадения» (ответ на конкретную проблему)
Добавьте «g» в конец регулярного выражения, чтобы включить глобальное сопоставление:
Но это только исправляет проблему в вопросе, где регулярное выражение заменяло только первое совпадение. Не используйте этот код.
источник
Я сделал несколько небольших модификаций в коде Трэвиса (просто чтобы избежать ненужного переобъявления - но он отлично работает для моих нужд, так что отличная работа!):
источник
[a-zA-Z]{2,6}
следует прочитать что-то вроде строки(?:[a-zA-Z]{2,6})+
, чтобы соответствовать более сложным доменным именам, например, email@example.co.uk.http://
илиwww
? Будет ли это работать для таких URL?replacePattern3 = /(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6})/gim;
этоreplacePattern3 = /(\w+@[a-zA-Z_]+?(\.[a-zA-Z]{2,6})+)/gim;
Сделал некоторые оптимизации для
Linkify()
кода Трэвиса выше. Я также исправил ошибку, из-за которой адреса электронной почты с форматами субдоменов не совпадали (например, example@domain.co.uk).Кроме того, я изменил реализацию для создания прототипа
String
класса, чтобы элементы могли быть сопоставлены следующим образом:Во всяком случае, вот сценарий:
источник
+
именами пользователей электронной почты, такими какfoo+bar@domain.com
. Я исправил это с помощью шаблона электронной почты/[\w.+]+@[a-zA-Z_-]+?(?:\.[a-zA-Z]{2,6})+/gim
(обратите внимание на+
первые скобки), но я не знаю, нарушает ли это что-то еще.Спасибо, это было очень полезно. Я также хотел что-то, что связывало бы вещи, которые выглядели бы как URL - в качестве основного требования, это связывало бы что-то вроде www.yahoo.com, даже если префикс протокола http: // отсутствовал. Так что в основном, если "www." присутствует, это свяжет это и предположит, что это http: //. Я также хотел, чтобы электронные письма превратились в ссылки mailto :. ПРИМЕР: www.yahoo.com будет преобразован в www.yahoo.com
Вот код, с которым я закончил (комбинация кода с этой страницы и других вещей, которые я нашел в Интернете, и других вещей, которые я сделал самостоятельно):
Во 2-й замене часть (^ | [^ /]) заменяет www.whever.com только в том случае, если перед ней еще нет префикса //, чтобы избежать двойной ссылки, если URL-адрес уже был связан в первой замене. Также возможно, что www.whever.com может находиться в начале строки, что является первым условием «или» в этой части регулярного выражения.
Это может быть интегрировано как плагин jQuery, как проиллюстрировано выше Джесси Р - но я специально хотел, чтобы обычная функция не действовала на существующий элемент DOM, потому что я беру текст, который у меня есть, и затем добавляю его в DOM, и Я хочу, чтобы текст был «связан» перед его добавлением, поэтому я пропускаю текст через эту функцию. Работает отлично.
источник
Определить URL сложно, потому что они часто окружены знаками препинания, а пользователи часто не используют полную форму URL. Существует много функций JavaScript для замены URL гиперссылками, но я не смог найти такую, которая бы работала так же хорошо, как
urlize
фильтр в основанной на Python веб-среде Django. Поэтому я перенесurlize
функцию Django на JavaScript:Пример:
Второй аргумент, если он истинный, вызывает
rel="nofollow"
вставку. Третий аргумент, если он истинный, экранирует символы, которые имеют особое значение в HTML. Смотрите файл README .источник
django_compatible
в false, он будет лучше обрабатывать этот вариант использования.urlize
не поддерживает TLD должным образом (по крайней мере, порт JS на GitHub). Библиотека, которая правильно обрабатывает TLD, - это JavaScript Linkify Бена Алмана .Я внес изменения в Roshambo String.linkify () в emailAddressPattern для распознавания адресов aaa.bbb. @ Ccc.ddd.
источник
Я искал в Google что-нибудь новее и наткнулся на это:
демо: http://jsfiddle.net/kachibito/hEgvc/1/
Работает очень хорошо для нормальных ссылок.
источник
http://example.com/folder/folder/folder/
иhttps://example.org/blah
т. Д. - просто ваш типичный не сумасшедший формат URL, который будет соответствовать 95-99% случаев использования. Я использую это для внутренней административной области, поэтому мне не нужно ничего необычного, чтобы ловить пограничные случаи или хэш-ссылки.Лучший скрипт для этого: http://benalman.com/projects/javascript-linkify-process-lin/
источник
Это решение работает, как и многие другие, и фактически использует то же регулярное выражение, что и одно из них, однако вместо возврата строки HTML это вернет фрагмент документа, содержащий элемент A и любые применимые текстовые узлы.
Есть некоторые предостережения, а именно с более старой поддержкой IE и textContent.
вот демо
источник
Если вам нужно показать более короткую ссылку (только домен), но с таким же длинным URL, вы можете попробовать мою модификацию версии кода Сэма Хаслера, опубликованную выше
источник
Reg Ex:
/(\b((https?|ftp|file):\/\/|(www))[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|]*)/ig
Ниже приведены некоторые проверенные строки:
Примечание: если вы не хотите передавать
www
как действительный, просто используйте ниже reg ex:/(\b((https?|ftp|file):\/\/|(www))[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig
источник
Предупреждения о сложности URI должны быть записаны, но простой ответ на ваш вопрос таков:
Чтобы заменить каждое совпадение, вам нужно добавить
/g
флаг в конец RegEx:/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi
источник
простой пример
источник
Будь проще! Скажите, что вы не можете иметь, а не то, что вы можете иметь :)
Как упоминалось выше, URL-адреса могут быть довольно сложными, особенно после «?», И не все из них начинаются с «www». например
maps.bing.com/something?key=!"£$%^*()&lat=65&lon&lon=20
Таким образом, вместо того, чтобы иметь сложное регулярное выражение, которое не удовлетворяет всем крайним случаям, и будет трудно поддерживать, как насчет этого гораздо более простого, который хорошо работает для меня на практике.
Матч
http(s):// (anything but a space)+
www. (anything but a space)+
Где «что-нибудь» - это
[^'"<>\s]
... в основном жадная спичка, в которой вы встретите пробел, цитату, угловую скобку или конец строкиТакже:
Не забудьте проверить, что он еще не в формате URL, например, текст содержит
href="..."
илиsrc="..."
Добавить ref = nofollow (если необходимо)
Это решение не так «хорошо», как библиотеки, упомянутые выше, но намного проще и хорошо работает на практике.
источник
Корректное обнаружение URL с поддержкой международных доменов и астральных символов - не тривиальная вещь
linkify-it
библиотека строит регулярные выражения из многих условий , а конечный размер составляет около 6 килобайт :). Это более точно, чем все библиотеки, на которые в настоящее время есть ссылка в принятом ответе.Смотрите ссылку-это демо чтобы проверить все крайние случаи и проверить свои.
Если вам нужно связать исходный код HTML, вам следует сначала проанализировать его и повторить каждый текстовый токен отдельно.
источник
Я написал еще одну библиотеку JavaScript, она может быть лучше для вас, поскольку она очень чувствительна к наименьшему количеству ложных срабатываний, быстрая и небольшая по размеру. В настоящее время я активно поддерживаю его, поэтому, пожалуйста, протестируйте его на демонстрационной странице и посмотрите, как он будет работать для вас.
ссылка: https://github.com/alexcorvi/anchorme.js
источник
Мне пришлось сделать обратное, и сделать HTML-ссылки только в URL, но я изменил ваше регулярное выражение, и это работает как шарм, спасибо :)
источник
Обнаружение электронной почты в ответе Travitron выше не сработало для меня, поэтому я расширил / заменил его следующим (код C #).
Это позволяет использовать адреса электронной почты, такие как « firstname.secondname@one.two.three.co.uk ».
источник
После ввода из нескольких источников у меня теперь есть решение, которое работает хорошо. Это было связано с написанием собственного кода замены.
Ответа на этот вопрос .
Скрипки .
источник
Замените URL-адреса в тексте ссылками HTML, игнорируйте URL-адреса в теге href / pre. https://github.com/JimLiu/auto-link
источник
Вот мое решение:
источник
Попробуйте следующую функцию:
alert(anchorify("Hola amigo! https://www.sharda.ac.in/academics/"));
источник
Попробуйте ниже решение
источник