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::$length属性和DOMNodeList::item($index)方法循环它。

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

现在您只需要创建DOMNode并附加它。使用 DOM 可能不直观,但至少熟悉文档后它很简单。

将此页放在枕头下。

于 2013-07-28T09:38:09.927 回答