Replace в регулярном выражении

262
28 февраля 2017, 17:27

Не могу разобраться в replace в регулярном выражении.
Вот сама регулярка:
/(^https?:\/\/www\.dropbox\.com)(\/s\/\w+\/[\wа-яА-Яё]+\.\w+)/
Применяться будет к такого рода ссылкам:

https://www.dropbox.com/s/2f15pra2dssf7zvwf7b/333.jpg?dl=0
https://www.dropbox.com/s/rhdkdf15dykctjdp004/376.jpg?dl=0
https://www.dropbox.com/s/kx70sj1gru4vsawhg9/517.jpg?dl=0

Вообще задача состоит в том, чтобы заменить, к примеру, первую ссылку, на такую:
https://dl.dropboxusercontent.com/s/2f15pra2dssf7zvwf7b/333.jpg

То есть нужно заменить первую часть ссылки и убрать ненужный мусор типа ?dl=0.

Вот сама функция .replace:

var1.replace(/(^https?:\/\/www\.dropbox\.com)(\/s\/\w+\/[\wа-яА-Яё]+\.\w+)/,
"https://dl.dropboxusercontent.com/$2")

Пример на regex101: https://regex101.com/r/ErgOTW/3

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

Answer 1

Проблема вашей регулярки в том, что она не захватывает часть после знака ?. Как следствие, String.prototype.replace применяется только к основной части URL.

Правильная регулярка может иметь вид:

var re = /(^https?:\/\/www\.dropbox\.com)(\/s\/\w+\/[\wа-яё]+\.\w+)\?.*/mgi;
[
  'https://www.dropbox.com/s/2f15pra2dssf7zvwf7b/333.jpg?dl=0',
  'https://www.dropbox.com/s/rhdkdf15dykctjdp004/376.jpg?dl=0',
  'https://www.dropbox.com/s/kx70sj1gru4vsawhg9/517.jpg?dl=0'
].forEach(function(str) {
    console.log(str.replace(re, 'https://dl.dropboxusercontent.com$2'));
});

Вот рабочий пример на JSFiddle. А вот и пример на regex101 для иллюстрации работы самого регулярного выражения.

READ ALSO
Подгрузка контента

Подгрузка контента

Этот скрипт подгружает контент без перезагрузки страницыВ функции указана подгрузка в один div, КАК СДЕЛАТЬ ПОДГРУЗКУ В РАЗНЫЕ div ОДНОВРЕМЕННО...

360