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

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

Может есть варианты лучше?
Заранее спасибо за помощь
  • Вопрос задан
  • 85 просмотров
Пригласить эксперта
Ответы на вопрос 1
SerafimArts
@SerafimArts
Laravel Framework Russian Community
Может есть варианты лучше?


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

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

Войти через центр авторизации
Похожие вопросы
Лучшие люди Иваново
от 40 000 до 90 000 руб.
N1.RU Новосибирск
от 100 000 руб.
Living Core Казань
от 50 000 руб.