обновить После более внимательного рассмотрения я предлагаю 2 решения, которые в относительной степени смягчают проблему обратного отслеживания. Прежде чем рассматривать их, я хочу указать на то, что с синтаксисом CSS связано очень мало разделителей. Более того, это больше связано с порядком и содержанием разрешенных символов, которые определяют синтаксис CSS.
Лекарство от поиска с возвратом состоит в том, чтобы ограничить механизм регулярных выражений меньшим количеством допустимых символы для соответствия и в пределах стратегии c позиции. Если вы посмотрите здесь спецификацию CSS -> https://www.w3.org/TR/CSS21/syndata.html вы заметите, что он полностью определяется регулярными выражениями. Это указывает на то, что парсеры CSS полностью построены с использованием обрезанной версии регулярного выражения.
Однако, хотя было бы интересным упражнением поместить его в все, охватывающее регулярное выражение, я отклоню эту задачу, потому что есть для меня ничего в этом нет.
Вместо этого я предлагаю эти 2 регулярных выражения, адаптированные к вашему запросу.
Первое:
- Соответствует только первому
url()
блоку в элементе <style>
<style[^>]*?>(?:[^{}:]*{[^{}]*?:[^{}()]*?})*?(?:([^{}:]*){[^{}]*?:\s*url\s*\(\s*([^{}()]*?)\s*\)\s*})
см. -> https://regex101.com/r/2SNIks/1
Второй:
- Соответствует всем блокам
url()
с элементом <style>
(?:<style[^>]*?>|(?!^)\G)(?:(?:(?!</style)[^{}:])*{[^{}]*?:[^{}()]*?})*?(?:([^{}:]*){[^{}]*?:\s*url\s*\(\s*([^{}()]*?)\s*\)\s*})
см. -> https://regex101.com/r/d8q6LH/1
Для обоих регулярных выражений
- Селектор находится в группе 1
- URL-адрес находится в группе 2