【问题标题】:How to return outer html of DOMDocument?如何返回DOMDocument的外部html?
【发布时间】:2011-07-21 06:26:47
【问题描述】:

我正在尝试替换字符串中的视频链接 - 这是我的代码:

$doc = new DOMDocument();
$doc->loadHTML($content);
foreach ($doc->getElementsByTagName("a") as $link) 
{
    $url = $link->getAttribute("href");
    if(strpos($url, ".flv"))
    {
        echo $link->outerHTML();
    }
}

不幸的是,当我尝试获取完整超链接的 html 代码时,outerHTML 不起作用,例如 <a href='http://www.myurl.com/video.flv'></a>

任何想法如何实现这一目标?

【问题讨论】:

    标签: php dom outerhtml


    【解决方案1】:

    从 PHP 5.3.6 开始,您可以将节点传递给 saveHtml,例如

    $domDocument->saveHtml($nodeToGetTheOuterHtmlFrom);
    

    以前的 PHP 版本没有实现这种可能性。您必须使用saveXml(),但这会创建符合 XML 的标记。对于 <a> 元素,这应该不是问题。

    http://blog.gordon-oheim.biz/2011-03-17-The-DOM-Goodie-in-PHP-5.3.6/

    【讨论】:

    • DOMNode 还包含包含的 DOMDocument,因此如果您只有想要获取 HTML 的节点,则可以这样做:$domNode->ownerDocument->saveHTML($domNode);
    【解决方案2】:

    您可以在 PHP 手册的DOM section 的用户注释中找到几个命题。

    例如,这是xwisdom 发布的一篇:

    <?php
    // code taken from the Raxan PDI framework
    // returns the html content of an element
    protected function nodeContent($n, $outer=false) {
        $d = new DOMDocument('1.0');
        $b = $d->importNode($n->cloneNode(true),true);
        $d->appendChild($b); $h = $d->saveHTML();
        // remove outter tags
        if (!$outer) $h = substr($h,strpos($h,'>')+1,-(strlen($n->nodeName)+4));
        return $h;
    }
    ?> 
    

    【讨论】:

    • 谢谢你,但我实际上正在寻找完整的 OUTER html - 完整的代码,包括 :/
    • @Fuxi 从代码来看我会说你必须将 $outer 设置为 TRUE 。但是确实没有理由使用该功能,因为您可以使用saveXmlsaveHTML 来获取outerHTML,就像我的回答中解释的那样。
    • @Gordon 感谢您的评论 :-) (我同意“使用 saveHTML”的想法——如果使用 PHP >= 5.3.6)
    【解决方案3】:

    最好的解决方案是定义你自己的函数,它会返回给你 externalhtml:

    function outerHTML($e) {
         $doc = new DOMDocument();
         $doc->appendChild($doc->importNode($e, true));
         return $doc->saveHTML();
    }
    

    你可以在你的代码中使用

    echo outerHTML($link); 
    

    【讨论】:

    • 仅适用于 PHP
    【解决方案4】:

    将带有 href 的文件重命名为 links.html 或 links.html 以表示其中包含 flv 的 google.com/fly.html 或将 flv 更改为 wmv 等,如果还有其他 href 它也会把它们捡起来

      <?php
      $contents = file_get_contents("links.html");
      $domdoc = new DOMDocument();
      $domdoc->preservewhitespaces=“false”;
      $domdoc->loadHTML($contents);
      $xpath = new DOMXpath($domdoc);
      $query = '//@href';
      $nodeList = $xpath->query($query);
      foreach ($nodeList as $node){
        if(strpos($node->nodeValue, ".flv")){
          $linksList = $node->nodeValue;
          $htmlAnchor = new DOMElement("a", $linksList);
          $htmlURL = new DOMAttr("href", $linksList);
          $domdoc->appendChild($htmlAnchor);
          $htmlAnchor->appendChild($htmlURL);
          $domdoc->saveHTML();
          echo ("<a href='". $node->nodeValue. "'>". $node->nodeValue. "</a><br />");
        }
      }
    echo("done");
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-13
      • 2023-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多