Как оптимизировать код?

Задача следующая: на вход подается файл с 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 по {, чтобы явно выделить список классов, но мне кажется решение получается уж слишком костыльным и далекоооо не оптимальным.

Может есть варианты лучше?
Заранее спасибо за помощь
  • Вопрос задан
  • 89 просмотров
Пригласить эксперта
Ответы на вопрос 1
SerafimArts
@SerafimArts
Senior Notepad Reader
Может есть варианты лучше?


Сделать лексер, реализовать парсер, построить AST и с ним уже играться. Вполне себе вариант получше.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы