Html doküman türü ekleyerek DOM ayrıştırma önlemek için nasıl

4 Cevap php
<?
    $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();


?>

Ben dizeleri ayrıştırmak için bu kodu kullanıyorum. Dize Bu işlev tarafından döndürülen zaman, bazı ilave etiketleri vardır:

<!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>

Bunu önlemek ve temiz bir dize iade için herhangi bir yolu var mı? Bu giriş dizesi sadece, örneğin, kullanımında herhangi bir html dize olabilir edilir.

4 Cevap

Aslında aynı çözüm arıyorum. Ben loadHTML yaptığınızda ancak <p> metin düğümü etrafında hala eklenecek, bunu yapmak için bir innerHTML yöntemi kullanılarak oldum. Ben başka bir çözümleyici kullanmadan etrafında almak için bir yol var, öyle değil mi, ya da yok bunu söylemek için bazı gizli bayrağı var.

Bu kod:

<?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 );

Çıktısı:

<p>Some photos<br><br><br><br><br></p>

Ancak tabii ki bu çözüm% 100 sağlam biçimlendirme tutmaz, ama yakındır.

LoadHTML kullandıktan sonra, bunu yapabilirsiniz:

# loadHTML causes a !DOCTYPE tag to be added, so remove it:
$dom->removeChild($dom->firstChild);

# it also wraps the code in <html><body></body></html>, so remove that:
$dom->replaceChild($dom->firstChild->firstChild->firstChild, $dom->firstChild);

!DOCTYPE etiketi silinecektir, ve body etiketinin içinde ilk tag html etiketini değiştirmek olacaktır.

Ben bu sorunla karşılaştı zaman olduğu gibi, body içindeki ilk etiketi yalnızca ilgileniyorsanız Açıkçası, bu sadece çalışır. Fakat bu örnek çaba biraz ile body içindeki her şeyi kopyalamak için adapte olabilir.

Edit: Meh, boşver. Ben Meder çözümünü istiyorum.

Her zaman sadece o ilk biraz dışarı atmak için bir regex kullanabilirsiniz:

echo preg_replace("/<!DOCTYPE [^>]+>/", "", $dom->saveHTML());

Ya bu gerçekten işe eğer emin değilim, ama DOMImplementation::createDocument when constructing your DOMDocument kullanarak deneyebilirsiniz - DOCTYPE kullanmak istediğiniz üçüncü argümandır.

Ayrıca, yerine saveHTML(), saveXML() deneyebilirsiniz