2

Symfony2 DomCrawler を使用して特定のノードを検索しています。

内部にhtmlを含むDOMDocumentがあります。私が基本的に行っているのは<p>、特定のクラス名を持つタグを検索していることです。

$dom オブジェクトに次の html があるとします。

<p class="one">class one</p>
<p class="two">class two is the <b>good</b> class</p>
<p class="tree">class tree</p>
<p class="four">class four</p>

私はそれから使用しています

$crawler    = new Crawler($dom);
$class      = 'two';
$paragraphs = $crawler->filterXPath('//p');

foreach( $paragraphs as $paragraph ) {
        if ( $paragraph->hasAttribute('class') === false ) {
            continue;
        }

        $class = $paragraph->getAttribute('class');

        if($class == $class_name){
            $node_value = $paragraph->nodeValue;
        }

問題は、ここで、私が得ていることです

class two is the good class

そして、私は取得したいです

class two is the <b>good</b> class

<b></b>これらのタグを結果に保持する方法は?

4

1 に答える 1

2

これは、<b></b>がサブノードであり、->nodeValueそのコンテンツのみを取得するためです。別の質問
で述べたように、子ノードのコンテンツを取得する必要があります

このサンプルはあなたの場合に機能します

$dom = <<<'STR'
<p class="one">class one</p>
<p class="two">class two is the <b>good</b> class</p>
<p class="tree">class tree</p>
<p class="four">class four</p>
STR;

$crawler    = new Crawler($dom);
$class_name = 'two';
$paragraphs = $crawler->filterXPath('//p');

foreach ($paragraphs as $paragraph) {
    if (false === $paragraph->hasAttribute('class')) {
        continue;
    }

    $class = $paragraph->getAttribute('class');

    if ($class == $class_name) {
        $value = '';

        foreach ($paragraph->childNodes as $child) {
            $value .= $paragraph->ownerDocument->saveHTML($child);
        }
    }
}

echo $value; // class two is the <b>good</b> class
于 2013-09-25T15:36:11.290 に答える