<?
    $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();
?>
我正在使用此代码来解析字符串.当此函数返回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>
有没有办法避免这种情况并且返回干净的字符串?这个输入字符串只是例如,在使用中它可以是任何html字符串.
我其实正在寻找相同的解决方案.我一直在使用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 );
将输出:
<p>Some photos<br><br><br><br><br></p>
但是,当然这个解决方案并没有保持100%完整的标记,但它已经接近了.
嘿,为什么不回答一个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();
我们传递两个常量:LIBXML_HTML_NODEFDTD表示不添加文档类型定义,并LIBXML_HTML_NOIMPLIED表示不添加诸如<html>和的隐含元素<body>。