Nasıl kısmi HTML ayrıştırmak?

5 Cevap php

Ben PHP DOM ile bazı HTML ayrıştırmak çalışıyorum, ama bazı sorunlar yaşıyorum. İlk olarak, bu çözüm değiştirmek durumunda, ben HTML, bir tam sayfa değil, daha ziyade, bunun sadece bir parçası.

<!-- This is the HTML that I have --><a href='/games/'>
<div id='game'>
<img src='http://images.example.com/games.gif' width='300' height='137' border='0'>
<br><b> Game </b>
</div>
<div id='double'>
<img src='http://images.example.com/double.gif' width='300' height='27' border='0' alt='' title=''>
</div>
</a>

Şimdi kimliği ile sadece div almaya çalışıyorum double. Ben aşağıdaki kodu denedim, ama düzgün çalışıyor gibi görünmüyor. Ne yanlış yapıyor olabilir?

//The HTML has been loaded into the variable $html
$dom=new domDocument;
$dom->loadHTML($html);
$dom->preserveWhiteSpace = false; 
$keepme = $dom->getElementById('double'); 

$contents = '<div style="text-align:center">'.$keepme.'</a></div>';
echo $contents;

5 Cevap

I-DOMDocument::getElementById will not work in your case : (quoting) düşünmek

For this function to work, you will need either to set some ID attributes with DOMElement::setIdAttribute or a DTD which defines an attribute to be of type ID.
In the later case, you will need to validate your document with DOMDocument::validate or DOMDocument->validateOnParse before using this function.


A solution that might work is using some XPath query to extract the element you are looking for.

Her şeyden önce, ilk yaptığı gibi en, HTML bölümünü yüklemek atalım:

$dom=new domDocument;
$dom->loadHTML($html);
var_dump($dom->saveHTML());

Onun çıkış bakarsak, var - var_dump sadece HTML kısmı başarıyla yüklenmiş olduğunu kanıtlamak için burada.


Then, instanciate the DOMXPath class, and use it to query for the element you want to get :

$xpath = new DOMXpath($dom);
$result = $xpath->query("//*[@id = 'double']");
$keepme = $result->item(0);

Şimdi istediğiniz öğeye sahip ;-)


But, in order to inject its HTML content in another HTML segment, we must first get its HTML content.

Bunu yapmak için herhangi bir "kolay" bir şekilde hatırlamıyorum, ama böyle bir şey hile yapmak Semester:

$tempDom = new DOMDocument();
$tempImported = $tempDom->importNode($keepme, true);
$tempDom->appendChild($tempImported);
$newHtml = $tempDom->saveHTML();
var_dump($newHtml);

Ve ... Biz HTML içeriğe sahip double <div>:

string '<div id="double">
<img src="http://images.example.com/double.gif" width="300" height="27" border="0" alt="" title="">
</div>
' (length=125)


Now, you just have to do whatever you want with it ;-)

Dan DomDocument::getElementById

For this function to work, you will need either to set some ID attributes with DOMElement::setIdAttribute or a DTD which defines an attribute to be of type ID. In the later case, you will need to validate your document with DOMDocument::validate or DOMDocument->validateOnParse before using this function.

Bazı ek bilgi için

Ve birisi er ya da geç bir düzenli ifade ile yapıyor değineceğim, çünkü burada kullanabilirsiniz kalıptır: /<div id='double'>(.*)<\/div>/simU

Buna ek olarak, sadece, örneğin, div kısmını ayıklamak için düzenli dize işlevlerini kullanabilirsiniz

$div = strstr($html, '<div id="double">');
$div = substr($div, 0, strpos($div, '</div>') + 6);
echo $div;

Ben kabul ederken, parsing HTML veya XML için RegEx veya Dize işlevleri kullanmak gerekir, ben fragmanlarından, as long as your only concern is to get this single div bunu kesinlikle tamam bulabilirsiniz. Basit tutun.

HTML Tidy diğer araçlar ile çözümlenebilir şey dönüştürerek, kırık ve parçalanmış HTML belgeleri "düzeltmek" yeteneğine sahip olmalı

http://devzone.zend.com/article/761

The Tidy extension is new in PHP 5, and is available from PHP version 5.0b3 upward. It is based on the TidyLib library, and allows the developer to validate, repair, and parse HTML, XHTML and XML documents from within PHP.

An XML document can only have one element at the root level. Probably, the HTML parser has a similar requirement. Try wrapping the content in a <body/> etiketi.

Başka bir şey var gibi görünüyor. This page nedeni ne olabilir açıklar. Sana öğesi almak için XPath kullanmanızı tavsiye ederim.

The fragment is HTML, but to be parsed through DOM it should XHTML. Every open tag must be closed.

Senin durumunda bu <br> <br /> ve <img ... > <img ... /> ile ile değiştirmeniz gerekir demektir