Задача следующая: на вход подается файл с css стилями. Необходимо перед каждым классом/идентификатором/элементом поставить нужный идентификатор.
Реализация следующая:
// Регулярка для комментариев
$regex = array(
"`^([\t\s]+)`ism"=>'',
"`^\/\*(.+?)\*\/`ism"=>"",
"`([\n\A;]+)\/\*(.+?)\*\/`ism"=>"$1",
"`([\n\A;\s]+)//(.+?)[\n\r]`ism"=>"$1\n",
"`(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+`ism"=>"\n"
);
// Удаляем комментарии
$css_demo = preg_replace(array_keys($regex),$regex,$css_demo);
// Удаляем медиа запросы
$css_demo = preg_replace('/@media [^{]*{([^{}]|{[^{}]*})*}/', '', $css_demo);
// Удаляем шрифты
$css_demo = preg_replace('/@font [^{]*{([^{}]|{[^{}]*})*}/', '', $css_demo);
// Разбиваем строку по ключу }
$cuttedStyles = explode("}", $css_demo);
$result = '';
$size = count($cuttedStyles);
$i = 0;
foreach ($cuttedStyles as $style) {
$i++;
// Если } последняя, #test не приписываем
if ($i == $size - 1) {
break;
}
$result .= '#test '.$style.'}';
}
Но я более чем уверен, что есть способ гораздо проще.
Удаление @ media и @ font-face вовсе не обязательно, но для текущей реализации это нужно, чтобы комментарии и сами классы не соединялись
Плюс ко всему, если задано несколько классов (.test, .sub_test{ ... }), то наш #test дописывается только к первому.
Если дополнительно делать explode по запятой, то #test может дописываться куда ему не надо (например font-family:"Dosis", sans-serif; ---> font-family:"Dosis" , #test sans-serif;). Можно сделать еще explode по {, чтобы явно выделить список классов, но мне кажется решение получается уж слишком костыльным и далекоооо не оптимальным.
Может есть варианты лучше?
Заранее спасибо за помощь