PHP DOMDocument - BODY olsun html kaynak

4 Cevap php

Sonra üzerinden bir iyi biçimli sonuç alma içeriğini ayrıştırmak için loadHTML yöntemini kullanarak kullanıcı gönderilen HTML ayrıştırmak ve normalleştirmek için PHP'nin DOMDocument kullanıyorum saveHTML:

$dom= new DOMDocument();
$dom->loadHTML('<div><p>Hello World');
$well_formed= $dom->saveHTML(); 
echo($well_formed);

Bu fragmanını ayrıştırma ve uygun kapanış etiketleri ekleyerek güzel bir iş yok. Sorun ben de, ben <html>, örneğin <!DOCTYPE> olarak istemediğiniz etiketleri bir demet almak <head> ve {[(3)] olmam }. Ben her iyi oluşturulmuş bir HTML belgesi bu etiketleri ihtiyacı olduğunu anlıyorum, ama ben normalleştirme olduğum HTML parçası varolan geçerli belgeye eklenen olacak.

4 Cevap

,, HTML kodunun bir kısmı - Senin durumunda IN, bir HTML belgesi ile çalışmak istiyorum, ama bir HTML fragmanı ile yok hangi DOMDocument ihtiyacınız oldukça ne olmadığı anlamına gelir.

Bunun yerine, ben değil gibi bir şey kullanın HTMLPurifier (quoting) olacaktır:

HTML Purifier is a standards-compliant HTML filter library written in PHP. HTML Purifier will not only remove all malicious code (better known as XSS) with a thoroughly audited, secure yet permissive whitelist, it will also make sure your documents are standards compliant, something only achievable with a comprehensive knowledge of W3C's specifications.

Ve, kod sizin kısmı çalışırsanız:

<div><p>Hello World

the demo page of HTMLPurifier, bir çıkış olarak bu temiz HTML olsun kullanma:

<div><p>Hello World</p></div>

Çok daha iyi, değil mi? ;-)

(Note that HTMLPurfier suppots a wide range of options, and that taking a look at its documentation might not hurt)

Sorununuza çabuk çözüm vücut kapmak için bir xPath ifade kullanmaktır.

$dom= new DOMDocument();
$dom->loadHTML('<div><p>Hello World');      
$xpath = new DOMXPath($dom);
$body = $xpath->query('/html/body');
echo($dom->saveXml($body->item(0)));

Burada uyarı bir kelime. Kesinlikle kötü biçimli HTML belgeleri karşılaştığında bazen loadHTML bir uyarı atmak olacaktır. HTML belgeleri bu tür ayrıştırma ediyorsanız, bir better html parser [kendi kendine bağlantı uyarı] bulmak gerekir.

Aynı sorun ile karşı karşıya, bu aşmak için SmartDOMDocument denilen DOMDocument etrafında sarıcı ve (örneğin kodlama problemleri gibi) diğer bazı eksiklikleri oluşturduk.

Bunu burada bulabilirsiniz: http://beerpla.net/projects/smartdomdocument

Bu başka bir görevinden alınan ve benim kullanım için mükemmel çalıştı:

$layout = preg_replace('~<(?:!DOCTYPE|/?(?:html|head|body))[^>]*>\s*~i', '', $layout);