将div添加到使用File_get_contents获取的html代码中

时间:2013-07-28 08:57:47

标签: php

我正在使用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>

我想在关闭</td>

之前添加下面的div
<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。

2 个答案:

答案 0 :(得分: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;
}

我有updated the used HTML使其符合XHTML并修复了样式问题(相关区域的css属性高度:附加了0px)。

答案 1 :(得分:0)

阅读文档!

DOMDocument::getElementsByTagName()方法返回DOMNodeList的实例。

DOMNodeList实现Traversible接口,这意味着它可以在foreach循环中使用。您还可以使用DOMNodeList::$length属性和DOMNodeList::item($index)方法对其进行循环。

循环DOMNodeList您将使用DOMNode的实例。 DOMNode类有一个名为DOMNode::appendChild()的方法,有趣的是,它以DOMNode作为参数。

现在你只需要创建DOMNode并附加它。使用DOM可能不是直观的,但是一旦熟悉了文档,至少它是简单

this page放在枕头下。