Основываясь на текущем ответе Танкталуса, стоит отметить несколько улучшений и крайних случаев.
CSS-синтаксический анализ Regex
\s*([^{]+)\s*\{\s*([^}]*?)\s*}
Это регулярное выражение выполнит некоторую обрезку пространства и попадет в некоторые дополнительные граничные случаи, как указано в этом примере: https://regex101.com/r/qQRIHx/5
ключ: пары значений; Подводные камни дальнейшего сложного регулярного выражения
Я тоже начал пробовать работу по разделению пар ключ: значение, но быстро обнаружил, что в случае выбора нескольких стилей на селектор все стало сложнее, чем я хотел. Вы можете просмотреть версию 1 регулярного выражения, где я попытался разграничить ключ: значения и как это не удалось с несколькими объявлениями здесь: https://regex101.com/r/qQRIHx/1
Осуществление
Как уже упоминалось, вы должны разбить это на несколько шагов, чтобы проанализировать и токенизировать ваш css. Это регулярное выражение поможет вам получить декларации, но вам нужно будет их разобрать.
Декларация парсера
Вы можете использовать что-то вроде этого для разбора объявлений после того, как вы получите свой первый набор совпадений.
([^:\s]+)*\s*:\s*([^;]+);
Пример: https://regex101.com/r/py9OKO/1/
Край случае
Приведенный выше пример прекрасно работает с несколькими объявлениями, но возможно, что это всего лишь 1 объявление без точки с запятой, которое будет отображаться в [большинстве] браузеров, но нарушит это регулярное выражение.
Отмеченные случаи
Вам также может понадобиться учитывать вложенные правила в случае, если есть медиа-запрос. В этом случае я бы попытался запустить регулярное выражение соответствия css для извлеченных объявлений. Если вы получаете совпадения, вы можете запустить рекурсию (хотя я не уверен, что бывают случаи, когда для ванильного CSS у вас будет более 1 уровня вложенности).
Краевые Чехлы
- Это не относится к правой фигурной скобке в строке
Завтрашнее исследование
Я решил вместо этого использовать пакет npm, например css
или cssom
. Я знаю, что это в PHP, но это будет очень тяжело для меня и поможет в крайних случаях, с которыми я продолжаю сталкиваться.
Редактировать
В итоге я использовал публичную библиотеку Jotform css.js. Он имеет очень маленькую площадь, что было одним из основных требований, которые я предъявлял при выборе библиотек для анализа CSS