eqiz
eqiz

Reputation: 1591

PHP - Get links from within an element after element has been found

I have the following code....

<div class="outer">
<div>
<h1>Christmas</h1>
 <ul>
  <li>Holiday</li>
  <li>Fun</li>
  <li>Joy</li>
 </ul>
<h1>4th July</h1>
 <ul>
  <li>Fireworks</li>
  <li>Happy</li>
  <li>Spectral</li>
 </ul>
</div>
</div>
<div class="outer">
<div>
<h1>Christmas2</h1>
 <ul>
  <li>Holiday</li>
  <li>Fun</li>
  <li>Joy</li>
 </ul>
<h1>4th July</h1>
 <ul>
  <li>Fireworks2</li>
  <li>Happy</li>
  <li>Spectral</li>
 </ul>
</div>
</div>

I already know that I can find the DIV and then look inside the DIV for the elements etc by doing...

$doc->loadHTML($output);    //$output being the text above
$xpath = new DOMXpath($doc);
$elements = $xpath->query('//div[@class="outer"]');  //Check outer

I know this above 3 lines will get the elements from within the DIV listed, but what I really want to be able to do is get the text of the [H1], then display the [li] values next to each H1..

the output i'm looking for is...

Christmas - Holiday, Fun, Joy
4th July - Fireworks, Happy, Spectral
Christmas2 - Holiday, Fun, Joy
4th July2 - Fireworks, Happy, Spectral

Upvotes: 0

Views: 261

Answers (2)

Kevin
Kevin

Reputation: 41885

Yes you can continue to use xpath to traverse the elements on the header and get its following sibling, the list. Example:

$doc = new DOMDocument();
$doc->loadHTML($output);
$xpath = new DOMXpath($doc);
$elements = $xpath->query('//div[@class="outer"]/div');
if($elements->length > 0) {
    foreach($elements as $div) {
        foreach ($xpath->query('./h1', $div) as $e) {
            $header = $e->nodeValue;
            $list = array();
            foreach ($xpath->query('./following-sibling::ul/li', $e) as $li) {

                $list[] = $li->nodeValue;
            }

            echo $header . ' - ' . implode(', ', $list) . '<br/>';
        }
        echo '<hr/>';
    }   
}

Sample Output

Upvotes: 1

Ivan Novak
Ivan Novak

Reputation: 666

I've used phpQuery for this type of issue in the past:

// include phpquery
require('phpQuery/phpQuery.php');
// initialize
$doc = phpQuery::newDocumentHTML($markup);
// get the text from the various elements
$h1Value = $doc['h1:first']->text(); // Christmas
// ... etc.

(untested)

Upvotes: 0

Related Questions