Я пытаюсь вытащить абсолютные URL-адреса из блока текста CSS и заменить их на относительные версии в JavaScript.Соответствующие URL-адреса фонового изображения с регулярными выражениями
Вот что я до сих пор, который работает отлично подходит для URL, которые не имеют каких-либо скобок в них:
var relativeCss = originalCss.replace(/url\(['|"]?(http[^\)|^'|^"]+)['|"]?\)/g, function(fullMatch, fullUrl) {
var fileName = fullUrl.substr(fullUrl.lastIndexOf('/') + 1);
return 'url("' + fileName + '")';
});
Однако, если есть URL с скобкой как часть имени файла, например background-image: url(http://uploads.server.com/IMG_0445 (2).jpg);
, то жадное регулярное выражение перестает останавливаться на первом найденном парне.
Вот простой тест: http://jsfiddle.net/NHfCg/1, для которого выход должен быть:
.rule1 { background-image: url("image1.png"); }
.rule2 { background-image: url("IMG_0445 (2).jpg"); }
Я мог бы написать более длинное регулярное выражение, которое ищет конкретные расширения файлов для оканчиваются на (например, .(png|jpg|jpeg)['|"]?\)
, но интересно, если есть способ ., чтобы сделать это без расширений белого списка
некоторых ограничениями я сталкиваюсь с:
- Я не могу предположить, что
background-image: url(...)
декларация будет правильно заканчиваться;
- Я не могу предположить, что
background-image: url(...)
будет иметь URL в кавычках - это может быть в кавычках, можно использовать одиночные кавычки ('
) или двойные кавычки ("
).
Это прекрасно работает, спасибо! Я понимаю, что могу сделать это одним выстрелом, но мне нужно сделать дополнительную обработку с соответствующей группой. –
Еще одно изменение учетной записи для нескольких определений URL в одной строке (так как 'background-image' поддерживает несколько изображений) было бы добавить' \, 'сразу после' \ r \ n'. –
@ VladMagdalin: действительно! Я забыл об этом. Чтобы справиться с этим случаем, вам нужно только запретить ',' (так как несколько 'url (....)' всегда разделяются с ','. Я отредактирую свой шаблон, чтобы добавить ',' в класс символов , –