@Mitras

Можно ли заменить в HTML и CSS названий классов и ID на crc32?

Типа мини обфускатор HTML+CSS
Есть страница условно с встроенным CSS и конечно же html код, все вместе.
Задача:
1. выгрести названия всех классов из CSS кастомных и заменить их скажем на crc32(
$_SERVER['HTTP_HOST'].$name_class) ну и соотвественно сделать тоже самое в html. Чтоб находился он правильно и работал в браузере.
2. Сделать тоже самое но с ID те с #
Ну я пошел сначала по такому пути:

$str = file_get_contents('index.html');
preg_match_all('/([\.|#][a-zA-Z0-9_-]{1,20}?) \{/is',$str,$matches);
$classes = $matches[1];
$host = $_SERVER['HTTP_HOST'];

foreach ($classes as $key_classes => $class){
    $class_minus_1 = mb_substr( $class, 1);
    $str = str_replace($class, crc32($class_minus_1.$host), $str);
    $str = str_replace("class=".$class_minus_1,"class=".crc32($class_minus_1.$host), $str);
    $str = str_replace("id=".$class_minus_1,"id=".crc32($class_minus_1.$host), $str);
}

echo $str;


Все как бы здорово, но не получается выпарсивать все полностью, и заменить грамотно. Например такие конструкции:
.progress-bar.progress-bar-success {
    border-radius: 7px !important;
    background-image: none !important;
}

Ставят его в тупик. Может есть какое то более гуманное решение ну там на подобие
PHP Simple HTML DOM Parser - там выводим допустим все названия классов и ID блоков, ну как то через тот же simple делаем замены?
  • Вопрос задан
  • 186 просмотров
Пригласить эксперта
Ответы на вопрос 1
Alex_Wells
@Alex_Wells
PHP/Kotlin
Для "сложных конструкций" без парсинга HTML - никак. Самый простой путь - preg_replace_callback на все CSS селекторы (включая .div .child, .div > .child, .div.child и тд), в колбеке - проходимся по HTML так, как это бы сделал css engine, меняем все что нужно и возвращаем такую же измененную строку.

В любом случае это извращение, имхо) Либо вариант проще - менять лишь названия без парсинга, при этом учитывая, что в .div .child, .div > child, .div.child будут заменены лишь названия, и для каждого типа div всегда будет равен одному хэшу.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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