Получить стиль CSS из PHP

Я анализирую страницы, используя Simple DOM parser. Он опрятен, но я бы хотел получить применяемый стиль CSS для каждого элемента. Не только встроенные стили, но и каждый стиль, который он применяет к этому элементу, будучи встроенным, встроенным или внешним.

Есть ли класс, который это делает? Если нет, как бы вы это сделали? Мне все равно, что вы не используете стили, каскады или стили браузера. Было бы достаточно всех примененных стилей.

Как говорит Мартин, при этом вы почти пишете браузер на PHP – это большой вопрос! Как и в случае с любым крупным проектом, ключ состоит в том, чтобы разбить его на более управляемые шаги (хотя некоторые из них не совсем прямолинейны).

Вам необходимо:

  • выработать, какие (если есть) внешние файлы css связаны с
  • (для эха Gumbo): найти (или разработать) способ чтения и интерпретации внешних css, in-page css и inline css
  • определите, какие стили применяются к каждому элементу (включая стили, применяемые .class, #id и типом элемента) и родителям каждого элемента, включая правила, которые css переопределяют, какие другие правила CSS и т. д.

Я бы не сказал, что это невозможно, так как такие вещи, как MPDF, делают почти то же самое (и могут стать хорошей отправной точкой), но я не думаю, что есть аккуратное быстрое исправление.

Это довольно высокий порядок. Рассмотрим этот простой пример:

<style> p .foo { color: yellow; } span > *[href] { color: red; } img + .foo { color: green; } span #bar { color: blue; } .baz #bar { color: black; } </style> <p class="baz">Lorem ipsum <span>dolor sit <img src="x.png"><a id="bar" class="foo" href="#top">amet</a>,</span> consectetur adipiscing elit. </p> 

Какой цвет является ссылкой? Каждый из 5 стилей применяется непосредственно к элементу ссылки. Даже когда вы рассматриваете только CSS2.1, у вас все еще есть 3 стиля для обработки.

Как говорит Gumbo, без полного анализатора и интерпретатора CSS это невозможно решить. Я еще не видел одного написанного на PHP, хотя теоретически его можно было бы написать.

(Есть классы для синтаксического разбора CSS, да – см. Ответы на этот вопрос , но они только скажут вам «для этого файла, у вас есть эти объявления CSS». Интерпретатор – самая сложная часть, и я не знаю PHP один)

Лучше всего будет отображать страницу в каком-то средстве рендеринга веб-страницы (например, Gecko или Webkit) и запрашивать свойства CSS. Это, к сожалению, далеко выходит за рамки простого класса PHP.

Возможно, вы захотите проверить часть CSS в библиотеке доступности QUAIL – нам тоже понадобилась эта функция, и мы в основном строили psuedo-браузер, основанный на DOMDocument. Из-за некоторых странных вещей с Xpaths в DOMDocument нам пришлось взломать дополнительный атрибут для каждого узла на странице, который действует как указатель на центральный массив вычисляемых стилей, но мы примерно на 70% прохождения тестов W3C.