Как заменить простые URL-адреса ссылками?

Asked
Viewd253928

461

Я использую указанную ниже функцию для сопоставления 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>"); 
}
 

24 ответов

285

Замена URL-адресов ссылками (ответ на общую проблему)

Регулярное выражение в вопросе пропускает много крайних случаев. При обнаружении URL-адресов всегда лучше использовать специализированную библиотеку, которая обрабатывает международные доменные имена, новые TLD, такие как .museum, круглые скобки и другие знаки препинания внутри и в конце URL-адреса, а также многие другие крайние случаи. См. Сообщение в блоге Джеффа Этвуда Проблема с URL-адресами для объяснения некоторых других проблем.

Лучшая сводка библиотек сопоставления URL находится в разделе Ответ Дэна Даскалеску  + 100
(по состоянию на февраль 2014 г.)


«Заставить регулярное выражение заменить более одного совпадения» (ответ на конкретную проблему)

Добавьте букву "g" в конец регулярного выражения, чтобы включить глобальное сопоставление:

 /ig;
 

Но это только решает проблему в вопросе, когда регулярное выражение заменяет только первое совпадение. Не используйте этот код.