2009-12-19 62 views
16

我想在PHP中解析一些HTML与DOM,但我有一些问题。首先,如果这改变了解决方案,我拥有的HTML不是整页,而只是它的一部分。如何解析部分HTML?

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

现在我试图得到唯一的ID为double的股利。我试过下面的代码,但它似乎没有正常工作。我可能会做错什么?

//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; 
+0

它正在做什么或不做更换<br>? – 2009-12-19 17:50:15

回答

13

我想DOMDocument::getElementById不会工作你的情况:(报价)

对于此功能工作,你会 需要或者设置一些ID与DOMElement::setIdAttribute或 DTD定义属性 类型ID为 的属性。
在后一种情况下,你 需要使用此功能与DOMDocument::validateDOMDocument->validateOnParse来验证文档 之前。


一个解决方案,可能会使用一些XPath query提取您正在寻找的单元工作。

首先,让我们来加载HTML部分,就像你第一次做:

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

var_dump这里只是为了证明HTML部分已成功加载 - 从它的输出来看,它有。


然后,实例化的DOMXPath类,并用它来查询元素你想:

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

我们现在必须元素,你想;-)


但,为了将HTML内容注入到另一个HTML片段中,我们必须首先获取它的HTML内容。

我不记得任何“简单”的方法来做到这一点,但像这样做前人的精力的伎俩:

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

而且......我们有你的double<div> HTML内容:

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


,你就必须做任何你想做的事情;-)

0

HTML整洁应该能够“纠正”破碎的和零散的HTML文件,把它们变成东西,可以使用其他工具来解析

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

整齐的扩展名是新的PHP 5, ,并且可从PHP版本 5.0b3向上获得。它基于TidyLib库,并允许 开发人员验证,修复和 从PHP内部解析HTML,XHTML和XML文档 。

3

DomDocument::getElementById

对于这个函数来工作,你将需要 要么设置一些属性ID与 ::一个DOMElement setIdAttribute或 DTD定义的属性为ID类型的 。在后一种情况下,您需要使用此函数在 之前使用DOMDocument :: validate或 验证文档 DOMDocument-> validateOnParse 。

对于一些更多的信息

而且因为总会有人提到用正则表达式做早晚,这里是你可以使用该模式: /<div id='double'>(.*)<\/div>/simU

在addi您可以使用常规字符串函数来提取div部分,例如

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

虽然我同意,你不应该使用正则表达式或字符串函数用于解析 HTML或XML,我发现它绝对好做,只要你唯一关心的是得到这个单格从碎片。把事情简单化。

+1

除非有嵌套的div标签当然。正则表达式是* not *用于解析html。 – troelskn 2009-12-19 18:38:01

+0

我会同意,如果他真的*解析*片段。但他只是想从中提取一个明确定义的部分。这不像他正在遍历DOM,所以我想可以把这个片段当作一个字符串来处理。 – Gordon 2009-12-19 18:43:31

+0

此外,我已经指出他在第一句中的SimpleHTML。 – Gordon 2009-12-19 19:06:12

0

一个XML文档只能在根级别有一个元素。可能的话,HTML解析器也有类似的要求。尝试将内容包装在 <body/>标记中。

好像是别的。 This page描述了可能的原因。我建议你使用XPath来获取元素。

-1

该片段是HTML,但要通过DOM解析它应该是XHTML。 每个打开的标签必须关闭。

你的情况,这意味着你应该<br /><img ... ><img ... />

+0

实际上并非如此。 $ dom-> loadHTML( “


”)工作得很好,并没有失败的解析。事实上,$ dom-> saveXML()会显示你正确输出封闭标签。 – 2010-02-18 22:50:56

+0

这一切都取决于你使用的图书馆。在python中:xml.dom.minidom.parseString(“
”) - >返回一个异常。 xml.dom.minidom.parseString(“
”)的作品。我希望首先以正确的格式输入输入,而不是像我期望的那样依赖库来解析不正确的输入。 – filippo 2010-02-19 08:55:55