web-dev-qa-db-ja.com

PHPでHTMLを解析する方法は?

PHP DOM を使用して、PHPを使用してHTMLを解析できることを知っています。 Stack Overflowでも多くの質問を見つけました。しかし、私には特定の要件があります。以下のような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を解析して、次のような2つの異なる配列にコンテンツを保存したいと思います。

$headingおよび$content

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

JQueryを使用するだけでこれを実現できます。しかし、それが正しい方法かどうかはわかりません。誰かが私を正しい方向に向けることができれば素晴らしいでしょう。前もって感謝します。

11
laradev

見てみてください PHP Simple HTML DOM Parser

JQueryに似た優れた構文を備えているため、IDまたはクラスによって必要な要素を簡単に選択できます。

// 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;
    }
}
17
Paul Denisevich

私はdomdocumentとdomxpathを使って解決策を得ました、あなたはそれを見つけることができます:

<?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;
    }
}

ライブ結果:http://saji89.codepad.org/2TyOAibZ

16
saji89

1つのオプションは、DOMDocumentとDOMXPathを使用することです。学ぶには少し曲線が必要ですが、一度習得すれば、達成できることにかなり満足するでしょう。

Php.netで以下を読んでください

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

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

お役に立てれば。

4
Greeso