如何避免DOM解析添加html doctype,<head>和<body>标签?

ili*_*ica 7 php parsing dom

<?
    $string = '
    Some photos<br>
    <span class="naslov_slike">photo_by_ile_IMG_1676-01</span><br />
    <span class="naslov_slike">photo_by_ile_IMG_1699-01</span><br />
    <span class="naslov_slike">photo_by_ile_IMG_1697-01</span><br />
    <span class="naslov_slike">photo_by_ile_IMG_1695-01</span><br />    
    ';

    $dom = new DOMDocument();
    $dom->loadHTML($string);
    $dom->preserveWhiteSpace = false;
    $elements = $dom->getElementsByTagName('span');
    $spans = array();
    foreach($elements as $span) {
        $spans[] = $span;
    }
    foreach($spans as $span) {
        $span->parentNode->removeChild($span);
    }
    echo $dom->saveHTML();


?>
Run Code Online (Sandbox Code Playgroud)

我正在使用此代码来解析字符串.当此函数返回string时,它有一些添加的标记:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>Some photos<br><br><br><br><br></p></body></html>
Run Code Online (Sandbox Code Playgroud)

有没有办法避免这种情况并且返回干净的字符串?这个输入字符串只是例如,在使用中它可以是任何html字符串.

med*_*iev 7

我其实正在寻找相同的解决方案.我一直在使用innerHTML方法来执行此操作,但是<p>当您执行loadHTML时,仍然会添加文本节点周围.我没有办法解决这个问题而不使用另一个解析器,或者有一些隐藏的标志告诉它不要这样做.

这段代码:

<?php

function innerHTML($node){
  $doc = new DOMDocument();
  foreach ($node->childNodes as $child)
    $doc->appendChild($doc->importNode($child, true));

  return $doc->saveHTML();
}

 $string = '
    Some photos<br>
    <span class="naslov_slike">photo_by_ile_IMG_1676-01</span><br />
    <span class="naslov_slike">photo_by_ile_IMG_1699-01</span><br />
    <span class="naslov_slike">photo_by_ile_IMG_1697-01</span><br />
    <span class="naslov_slike">photo_by_ile_IMG_1695-01</span><br />    
    ';

    $dom = new DOMDocument();
    $dom->preserveWhiteSpace = false;
    $dom->loadHTML($string);
    $elements = $dom->getElementsByTagName('span');
    $spans = array();
    foreach($elements as $span) {
        $spans[] = $span;
    }
    foreach($spans as $span) {
        $span->parentNode->removeChild($span);
    }

    echo innerHTML( $dom->documentElement->firstChild );
Run Code Online (Sandbox Code Playgroud)

将输出:

<p>Some photos<br><br><br><br><br></p>
Run Code Online (Sandbox Code Playgroud)

但是,当然这个解决方案并没有保持100%完整的标记,但它已经接近了.


mik*_*n32 5

嘿,为什么不回答一个9岁的问题呢?PHP 5.4版本(在提出此问题3年后发布)将options参数添加到DomDocument::loadHTML()。有了它,您可以执行以下操作:

$dom = new DomDocument();
$dom->loadHTML($string, LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED);
// do stuff
echo $dom->saveHTML();
Run Code Online (Sandbox Code Playgroud)

我们传递两个常量:LIBXML_HTML_NODEFDTD表示不添加文档类型定义,并LIBXML_HTML_NOIMPLIED表示不添加诸如<html>和的隐含元素<body>

  • 谢谢!这应该被接受的答案。拯救了我的一天! (2认同)