Как на JavaScript и replace заменить все вхождения, а не только первое?

Вопрос

Я использую функцию ниже, чтобы найти URL-адреса внутри заданного текста и заменяю их HTML-ссылками. Но это регулярное выражение работает только для первого совпадения.

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? Я предполагаю, что для этого мне следует использовать метод exec, но пока что не очень представляю, как именно это делать.


Ответ №1

Добавь ‘g’ в конец регулярного выражения, чтобы задать поиск по всему тексту:

function replaceURLWithHTMLLinks(text) {
    var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
    return text.replace(exp,"<a href='$1'>$1</a>"); 
}

Однако, отмечу, что Ваша функция несовершенна и будет пропускать URL, записанные в некоторых форматах, например, если после адреса будет идти запятая (http://www.example.com,) и т.д. О поддержке кириллических адресов вообще речи не идёт. Но это уже другой вопрос.

Нет комментариев

Добавить комментарий


(обязательно)