Как реализовать динамическую генерацию CSS классов на PHP?

Добрый день. Сразу скажу, что я прекрасно понимаю, что это почти никак не поможет в защите от парсинга, но мне хочется попробовать реализовать систему автоматической замены CSS классов на странице.

Допустим у нас есть такая HTML страница:
<div class="article">
    <div class="image">...</div>
    <h1 class="title">...</h1>
</div>

После выполнения скрипта должно получиться нечто подобное. При этом важно, чтобы CSS стили были сохранены.
<div class="06fe">
    <div class="414b">...</div>
    <h1 class="b3a4">...</h1>
</div>


Как я представлял себе решение задачи:
  • Парсю нужный HTML файл и получаю из него список всех используемых CSS классов
  • Парсю файл стилей и ищу в нем вхождения ранее найденных классов
  • В случае нахождения генерирую новое имя для класса. Также заменяю его в HTML
  • Сохраняю новые HTML и CSS файлы. Оригиналы файлов также куда-то складываю
  • Задача крутится в кроне и выполняется каждый час


Алгоритм действий вроде понятен. Но как только приступил к их выполнению, то сразу же столкнулся с несколькими трудностями. Вот некоторые из них:

  • Чем парсить HTML и как получить список классов?
    Нашёл специальную библиотеку DiDOM. Но она больше подходит для вычленения какой-либо информации. Мне лишь нужно получить массив используемых классов. Подойдет ли мне эта библиотека или есть более легкий способ?
  • Как искать нужные классы в CSS?
    Смог найти библиотеку sabberworm/PHP-CSS-Parser. Но не смог найти метод поиска определенного класса. Нужна ли мне вообще эта библиотека или можно ограничиться простым поиском-заменой?
  • Как быть уверенным, что после генерации не будет двух одинаковых классов?
    Думал либо просто использовать для имен достаточно длинную строчку из случайных символом, чтобы минимизировать вероятность генерации одинаковых значений. Достаточная ли эта мера или мне необходимо запоминать имена классов?

Буду благодарен за любую помощь. Если у вас есть опыт реализации подобных систем, то пожалуйста поделитесь знаниями. Заранее спасибо :)
  • Вопрос задан
  • 558 просмотров
Пригласить эксперта
Ответы на вопрос 4
profesor08
@profesor08 Куратор тега PHP
https://styled-components.com/ - прям на главной редактируй код и смотри что происходит с кнопками. Там же ты поймешь, что твоя задумка гораздо сложнее и ее решение лежит в другой плоскости, и требует специальной подготовки кода и подхода к разработке, основанном на компонентах. PHP же тут просто мимо проходил и его тегом зацепило.
Ответ написан
ArsenyMatytsyn
@ArsenyMatytsyn Куратор тега CSS
Руководитель frontend направления, предприниматель
Отложенная загрузка + intersectionObserver + JS-фреймворк + адовые анимации в ответ на fetch тебе в этом больше помогут, чем подобные извращения. В снижении риска быть спарсенным. Да и оптимизируешь возможно слегонца.
Ответ написан
Комментировать
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
зачем парсить html когда ты его сам же и генерируешь
Ответ написан
Комментировать
@strelok011
Не довелось применять, только слышал о новом подходе в использовании css, причем эта технология позволяет очень значительно сжать итоговый файл со стилями (на больших проектах).
Суть такова - проект создается в классическом произвольном режиме, именуете классы как удобно, на выходе компилятор разбирает все классы, приводит к набору базовых атрибутов. То есть на выходе будет стиль вида 'a ab sc o', каждый класс отвечает только за один атрибут. Их конечное и не очень большое число, выгода на больших проектах очевидна, так же смысл парсить результат сводится к 0. В итоге, если не ошибаюсь, размер css файла порядка сотни кб, тогда как на крупных проектах может достигать не одного мегабайта, размер html разметки остается вполне вменяемым.
Годится только для продакшн-релиза.

P.S. Источник не подскажу.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽