0

file_get_contentsリモートページのhtmlソースを取得するために使用していますが、コードは多くのテーブルで構成されています。

私がやろうとしているのは、コードには<td>以下のようなものがたくさんあるということです

   <td colspan="2">
         <b>Video </b> 
         <span class="section">Sports</span><b>: </b> 
         <span id="category466" class="category">Motor Sports</span>
    </td>

閉じる直前に下のdivを追加したい</td>

<div style="float: right; padding-right: 2px;"><a class="open_event_tab" target="_blank" href="page123.html" >open event</a></div> 

私のコードは次のようになります。

<?php
    //Get the url
    $url = "http://remotesite.com/page1.html";
    $html = file_get_contents($url);
    $doc = new DOMDocument(); // create DOMDocument
    libxml_use_internal_errors(true);
    $doc->loadHTML($html); // load HTML you can add $html

    $elements = $doc->getElementsByTagName('td');
?>

getElementsByTagName で停止し、上記のように div を追加する方法がわかりません。

4

2 に答える 2

0

このコードは、更新された HTML (コードの下) で機能するようになりました。必要な場所に div を挿入します。

<?php
//Get the url
$url = "http://remotesite.com/page1.html";
$html = file_get_contents($url);
$doc = new DOMDocument('1.0'); // create DOMDocument
libxml_use_internal_errors(false);
$doc->loadXML($html); // load HTML you can add $html
$domxpath = new DOMXPath($doc);
$filtered = $domxpath->query("//td[@colspan='2']");

$nodeList = $doc->getElementsByTagName('td');
$length = $filtered->length;

$nodes = array();
for ($i = $length - 1; $i >= 0; --$i) {
    $node = $filtered->item($i);
    $lastChildHTML = $doc->saveXML($node->lastChild);
    if (strpos($lastChildHTML, 'class="category"') !== false) {
        $nodes[] = $node;
    }
}

$allTDNodes = $doc->getElementsByTagName('td');
$tdNodes = array();
foreach ($allTDNodes as $tdNode) {
    if (in_array($tdNode, $nodes, true)) {
        $tdNodes[] = $tdNode;
    }
}
$tdNodes = array_reverse($tdNodes);

$length = count($nodes, 0);
for ($i = 0; $i < $length; $i++) {
    $replacement = $doc->createDocumentFragment();
    $nodeContent = $doc->saveXML($tdNodes[$i]);
    $replacement->appendXML($nodeContent);
    $divNode = createDivNode($doc);
    $replacement->firstChild->appendChild($divNode);
    $tdNodes[$i]->appendChild($divNode);
}

echo $doc->saveXML();

function createDivNode($doc) {
    $divNode = $doc->createElement('div');
    $divNode->setAttribute('style', 'float: right; padding-right: 2px;');
    $aNode = $doc->createElement('a', 'openEvent');
    $aNode->setAttribute('class', 'open_event_tab');
    $aNode->setAttribute('target', '_blank');
    $aNode->setAttribute('href', 'page123.html');
    $divNode->appendChild($aNode);
    return $divNode;
}

使用されている HTML を XHTML に準拠するように更新し、スタイルの問題を修正しました (関連する領域には css プロパティの height: 0px が添付されていました)。

于 2013-07-28T09:15:05.063 に答える
0

ドキュメントを読んでください!

DOMDocument::getElementsByTagName()メソッドは のインスタンスを返しますDOMNodeList

DOMNodeListこれは、ループTraversibleで使用できることを意味します。プロパティとメソッドforeachを使用してループすることもできます。DOMNodeList::$lengthDOMNodeList::item($index)

をループすると、 のDOMNodeListインスタンスが処理されますDOMNode。このDOMNodeクラスには というメソッドがDOMNode::appendChild()あり、面白いことに、DOMNode引数として a を取ります。

あとは、 を作成しDOMNodeて追加するだけです。DOM を操作するのは直感的ではないかもしれませんが、少なくともドキュメントに慣れれば簡単です。

このページを枕の下に置いてください。

于 2013-07-28T09:38:09.927 に答える