PHP: как я могу работать с HTML как XML? Как мне найти конкретные узлы и получить текст внутри этих узлов? - PullRequest
0 голосов
/ 01 июля 2010

Допустим, у меня есть следующая веб-страница:

<html>
<body>
 <div class="transform">
    <span>1</span>
 </div>
 <div class="transform">
    <span>2</span>
 </div>
 <div class="transform">
    <span>3</span>
 </div>
</body>
</html>

Я хотел бы найти все элементы div, содержащие преобразование класса, и извлечь текст в каждом элементе div?

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

update

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

в этом примере мне нужно запросить div, которые содержат атрибут class=transform

спасибо!

Ответы [ 3 ]

1 голос
/ 01 июля 2010

Вы можете использовать xpath для адресации элементов.Для этого конкретного запроса вы должны использовать:

div[contains(concat(" ",@class," "), concat(" ","transform"," "))]

Полный пример PHP:

<?php
  $document = new DomDocument();
  $document->loadHtml($html);
  $xpath = new DomXPath($document);
  foreach ($xpath->query('div[contains(concat(" ",@class," "), concat(" ","transform"," "))]') as $div) {
    var_dump($div);
  }

Если вы знаете CSS, вот удобный CSS-селектор для сопоставления выражений XPath: http://plasmasturm.org/log/444/ - Вы можете найти приведенный выше пример и другие распространенные запросы.

Если вы будете часто его использовать, то вам может пригодиться моя библиотека csslib .Он предлагает оболочку csslib_DomCssQuery, которая похожа на DomXPath, но использует вместо этого CSS-селекторы.

1 голос
/ 01 июля 2010

Можно использовать SimpleXML - см. Пример ниже:

$string = "<?xml version='1.0'?> 
<html>
<body>
 <div class='transform'>
    <span>1</span>
 </div>
 <div>
    <span>2</span>
 </div>
 <div class='transform'>
    <span>3</span>
 </div>
</body>
</html>";

$xml = simplexml_load_string($string);
$result = $xml->xpath("//div[@class = 'transform']");

foreach($result as $node) {
  echo "span " . $node->span . "<br />";
}

Обновлен с помощью xpath ...

0 голосов
/ 01 июля 2010

хорошо, то, что я хотел, можно легко сделать с помощью php xpath:

пример:

http://ditio.net/2008/12/01/php-xpath-tutorial-advanced-xml-part-1/
...