В общем решил это таким образом:
Читаем каждый css-файл, регуляркой
@([\.*\/\w+\/]*[\-\w]+\.(?>jpg|gif|png|svg|css|jpeg|woff|eot|ttf))@ (не очень-то ими владею, так что есть в ней проблемы) находим все ссылки на файлы. Для каждого совпадения делаем какие-то правки (для случаев типа ./filename.svg), конкатенируем эту ссылку с путём до css-файла в котором была ссылка и заменяем ей оригинал. После чего просто пишем всё в один большой файл (можно ещё минифицировать и всякое такое).
private static function fixPathes($css_file_name, $file_string) {
$path = dirname($css_file_name) . '/';
$mathes = [];
preg_match_all('@([\.*\/\w+\/]*[\-\w]+\.(?>jpg|gif|png|svg|css|jpeg|woff|eot|ttf))@iS', $file_string, $mathes);
$fixed = [];
foreach($mathes[0] as $original_file_name) {
if(isset($fixed[$original_file_name]))
continue;
if(strpos($original_file_name, './') === 0) {
$file_name = str_replace('./', '', $original_file_name);
} else {
$file_name = $original_file_name;
}
$file_string = str_replace($original_file_name, '/'.$path.$file_name, $file_string);
$fixed[$original_file_name] = true;
}
return $file_string;
}