Найти настройки в CSS с помощью PHP xPath - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь найти цвет диапазона в наборе ссылок в CSS следующего примера HTML, используя DOMDocument / xPath:

   <html>
      <head>
          <style>
             a span{
                color: #21d;
             }
          </style>
      </head>
      <body>
          <a href='test.html'>this is a <span>test</span></a>
      </body>
   </html>

Я могу найти все CSS с помощью xPath '// style '($css = $path->query( '//span' )->nodeValue), а затем сделать что-то с pregmatch для получения результата, но не знаете, есть ли способ получить этот цвет с помощью xPath, и если да, то каков этот способ.

1 Ответ

0 голосов
/ 16 октября 2018

XPath не особенно хорошо приспособлен к такого рода задачам, но вопреки тому, что было сказано в комментариях, возможно возможно с использованием evaluate() и некоторые вложенные строковые функции, такие как substring-before() и substring-after():

$html = '
    <html>
      <head>
          <style>
             a span{
                background-color: #ddd;
                color: #21d;
             }
          </style>
      </head>
      <body>
          <a href="test.html">this is a <span>test</span></a>
      </body>
   </html>
';

$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DomXPath($dom);

$result = $xpath->evaluate("
    substring-before(
        substring-after(
            substring-after(
                normalize-space(//style/text())
            , 'a span')
        ,' color:')
    ,';')
");
echo $result;

ВЫХОД:

#21d

Работа изнутри:

  1. Нормализация пробелов.
  2. Получение части текста стиля после выбора.
  3. Получитьтекст после рассматриваемого правила css.Обратите внимание, что я добавил пробел перед ' color:', чтобы избежать получения background-color или подобного.Нормализация пробела в первом шаге делает эту работу, даже если color: предшествует табуляция.
  4. получает строку перед последним ; правила color.

Я почти уверен, что здесь есть множество потенциальных точек отказа, и я бы не рекомендовал использовать XPath для чего-то подобного, но все равно это интересное упражнение.

...