Hoe HTML in PHP te ontleden?

Ik weet dat we PHP DOMkunnen gebruiken om HTML te ontleden met PHP . Ik vond hier ook veel vragen op Stack Overflow. Maar ik heb een specifieke eis. Ik heb een HTML-inhoud zoals hieronder

<p class="Heading1-P">
    <span class="Heading1-H">Chapter 1</span>
</p>
<p class="Normal-P">
    <span class="Normal-H">This is chapter 1</span>
</p>
<p class="Heading1-P">
    <span class="Heading1-H">Chapter 2</span>
</p>
<p class="Normal-P">
    <span class="Normal-H">This is chapter 2</span>
</p>
<p class="Heading1-P">
    <span class="Heading1-H">Chapter 3</span>
</p>
<p class="Normal-P">
    <span class="Normal-H">This is chapter 3</span>
</p>

Ik wil de bovenstaande HTML ontleden en de inhoud opslaan in twee verschillende arrays, zoals:

$headingen $content

$heading = array('Chapter 1','Chapter 2','Chapter 3');
$content = array('This is chapter 1','This is chapter 2','This is chapter 3');

Ik kan dit eenvoudig bereiken met jQuery. Maar ik weet niet zeker of dat de juiste manier is.
Het zou fijn zijn als iemand mij in de goede richting kan wijzen.
Bij voorbaat dank.


Antwoord 1, autoriteit 100%

Probeer te kijken naar PHP Simple HTML DOM Parser

Het heeft een briljante syntaxis vergelijkbaar met jQuery, zodat u eenvoudig elk gewenst element kunt selecteren op ID of klasse

// include/require the simple html dom parser file
$html_string = '
    <p class="Heading1-P">
        <span class="Heading1-H">Chapter 1</span>
    </p>
    <p class="Normal-P">
        <span class="Normal-H">This is chapter 1</span>
    </p>
    <p class="Heading1-P">
        <span class="Heading1-H">Chapter 2</span>
    </p>
    <p class="Normal-P">
        <span class="Normal-H">This is chapter 2</span>
    </p>
    <p class="Heading1-P">
        <span class="Heading1-H">Chapter 3</span>
    </p>
    <p class="Normal-P">
        <span class="Normal-H">This is chapter 3</span>
    </p>';
$html = str_get_html($html_string);
foreach($html->find('span') as $element) {
    if ($element->class === 'Heading1-H') {
        $heading[] = $element->innertext;
    }else if($element->class === 'Normal-H') {
        $content[] = $element->innertext;
    }
}

Antwoord 2, autoriteit 95%

Ik heb domdocument en domxpath gebruikt om de oplossing te krijgen, je kunt het vinden op:

<?php
$dom = new DomDocument();
$test='<p class="Heading1-P">
    <span class="Heading1-H">Chapter 1</span>
</p>
<p class="Normal-P">
    <span class="Normal-H">This is chapter 1</span>
</p>
<p class="Heading1-P">
    <span class="Heading1-H">Chapter 2</span>
</p>
<p class="Normal-P">
    <span class="Normal-H">This is chapter 2</span>
</p>
<p class="Heading1-P">
    <span class="Heading1-H">Chapter 3</span>
</p>
<p class="Normal-P">
    <span class="Normal-H">This is chapter 3</span>
</p>';
$dom->loadHTML($test);
$xpath = new DOMXpath($dom);
    $heading=parseToArray($xpath,'Heading1-H');
    $content=parseToArray($xpath,'Normal-H');
var_dump($heading);
echo "<br/>";
var_dump($content);
echo "<br/>";
function parseToArray($xpath,$class)
{
    $xpathquery="//span[@class='".$class."']";
    $elements = $xpath->query($xpathquery);
    if (!is_null($elements)) {  
        $resultarray=array();
        foreach ($elements as $element) {
            $nodes = $element->childNodes;
            foreach ($nodes as $node) {
              $resultarray[] = $node->nodeValue;
            }
        }
        return $resultarray;
    }
}

LIVE Resultaat: http://saji89.codepad.org/2tyoaibz


Antwoord 3, Autoriteit 19%

Eén optie voor u is om DomDocument en Domxpad te gebruiken. Ze hebben wel een beetje een curve nodig om te leren, maar als je eenmaal doet, zul je behoorlijk blij zijn met wat je kunt bereiken.

Lees het volgende in PHP.NET

http://php.net/mannual/en/class.ddocument.php

http://php.net/manual/en/class.domxpath.php

Ik hoop dat dit helpt.


Antwoord 4, Autoriteit 14%

Hier is een alternatieve manier om de HTML te ontleden met DiDOMwelke aanbiedingen aanzienlijk betere prestaties in termen van snelheid en Memory Footprint.

composer require imangazaliev/didom
<?php
use DiDom\Document;
require_once('vendor/autoload.php');
$html = <<<HTML
<p class="Heading1-P">
    <span class="Heading1-H">Chapter 1</span>
</p>
<p class="Normal-P">
    <span class="Normal-H">This is chapter 1</span>
</p>
<p class="Heading1-P">
    <span class="Heading1-H">Chapter 2</span>
</p>
<p class="Normal-P">
    <span class="Normal-H">This is chapter 2</span>
</p>
<p class="Heading1-P">
    <span class="Heading1-H">Chapter 3</span>
</p>
<p class="Normal-P">
    <span class="Normal-H">This is chapter 3</span>
</p>
HTML;
$document = new Document($html);
// find chapter headings
$elements = $document->find('.Heading1-H');
$headings = [];
foreach ($elements as $element) {
    $headings[] = $element->text();
}
// find chapter texts
$elements = $document->find('.Normal-H');
$chapters = [];
foreach ($elements as $element) {
    $chapters[] = $element->text();
}
echo("Headings\n");
foreach ($headings as $heading) {
    echo("- {$heading}\n");
}
echo("Chapter texts\n");
foreach ($chapters as $chapter) {
    echo("- {$chapter}\n");
}

Antwoord 5

// DOM maken van URL of bestand

$html = file_get_html('http://www.google.com/');

// Vind alle afbeeldingen

foreach($html->find('img') as $element) 
   echo $element->src . '<br>';

// Vind alle links

foreach($html->find('a') as $element) 
   echo $element->href . '<br>';

Other episodes