Javascript Regex - сопоставление открывающей и закрывающей круглых скобок при вложенных

У меня есть регулярное выражение для захвата фоновых URL-адресов из css:

/(@import.*?)?url\(([^)]+)\)/gi

Это работает отлично для большинства случаев. Однако, css в дикой природе - другое дело. Несмотря на то, что это неверно, мне нужно сопоставить url('/pix/ajax/ajax-loader (2).gif'), а также нечто более типичное, например url(/assets/[removed_email]), Я использовал свои ограниченные возможности регулярного выражения и мог использовать некоторую помощь. В тестовых случаях я использую:

background: url('/pix/ajax/ajax-loader (2).gif')
background: url(/pix/ajax/ajax-loader (2).gif)
background: url(/assets/[removed_email])
background: url('/assets/[removed_email]')
background-image: url(file.gif);
background-image: url('file.gif') no-repeat;
background: #FF0000 url( "file.gif" ) no-repeat ;
background: #FF0000 url( "file%20space.gif" ) no-repeat;

FYI я знаю, что регулярное выражение проблематично, и разбор с ним, как правило, не является лучшим решением, но в этом случае я застрял.

3 ответа

Следующее Regex обрабатывает все ваши тестовые примеры:

url\(.*\)

btw: regexpal - хороший сайт для проверки вашего регулярного выражения на лету.


Это очень неэлегантно, но он должен работать, чтобы извлекать URL-адреса без разделителей (т.е. Без каких-либо одиночных или двойных кавычек):

url\((?:(?:\s*(?:'([^']+)'|"([^"]+)")\s*)|([^)]+))\)

Вы извлекаете любые непустые совпадения для групп $1, $2 или $3.

Это работает для всех ваших примеров, кроме этого:

background: url(/pix/ajax/ajax-loader (2).gif)

но не зря, потому что у этого есть недопустимый синтаксис.


var regex = new RegExp(/^\s*background.*:.*url\((.+)\)/i);
console.log(regex.exec("background: url('/pix/ajax/ajax-loader (2).gif')")[1]);

НТН

licensed under cc by-sa 3.0 with attribution.