在php中解析DOM(类似于jQuery)


parse DOM in php (like in jQuery)

可能重复:
如何用PHP解析HTML?

我需要解析td标记中的一个字符串。我可以使用以下jQuery来完成这项工作:

$("#right .olddata:first td.numeric:first").html()

如果我在字符串变量中有HTML代码,我如何获得相同td的内容?

简单HTML DOM

SimpleHTMLDom提供了一种访问php中htmldom的面向对象方法。我以前曾成功地使用过它,但它会被大型dom结构阻塞。一个很好的特性是能够使用这种oo设计来操作和保存dom。它允许您执行dom的选择器搜索:

// Find all <div> which attribute id=foo
$ret = $html->find('div[id=foo]'); 

或:

// Find all <li> in <ul> 
foreach($html->find('ul') as $ul) 
{
       foreach($ul->find('li') as $li) 
       {
             // do something...
       }
}
// Find first <li> in first <ul> 
$e = $html->find('ul', 0)->find('li', 0);

它允许遍历:

echo $html->getElementById("div1")->childNodes(1)->childNodes(1)->childNodes(2)->getAttribute('id');

DOMDocument

正如其他人所指出的,您也可以使用DOMDocument。

XPath

根据我的个人经验,虽然xpath很难工作,但如果你只对从dom中提取信息感兴趣,这是值得的。

虽然与您试图提取的信息并不完全相关,但以下是我如何使用xpath从xml文档中提取信息:

XML:

<?xml version="1.0" encoding="utf-8"?>
<Report>
  <CampaignPerformanceReportColumns>
    <Column name="AccountName" />
    ...
    <Column name="CampaignId" />
  </CampaignPerformanceReportColumns>
  <Table>
    <Row>
      <CampaignName value="Auctions" />
      <GregorianDate value="8/11/2010" />
      ...
      <CampaignId value="60312546" />
    </Row>
    <Row>
      <CampaignName value="Auctions" />
      <GregorianDate value="8/11/2010" />
      ...
      <CampaignId value="60312546" />
    </Row>
    <Row>
      <CampaignName value="Auctions 2" />
      <GregorianDate value="8/11/2010" />
      ...
      <CampaignId value="603125467" />
    </Row>
  </Table>
</Report>

PHP:

$xml = simplexml_load_file($file);
// Get each Row
$result = $xml->xpath("Table/Row");
// Get the CampaignId of each Row
$result = $xml->xpath("//Row/CampaignId");

XPath还有更多的特性;如果您需要从任何xml结构化文档中提取大量信息,我鼓励您探索它。

您可以使用DOMDocumentDOMXPath

示例(我们的HTML位于字符串变量$html中(:

$doc = new DOMDocument();
$doc->loadHTML($html);
$XPath = new DOMXPath($doc);
$tr = $XPath->query('//*[@id="right"]//*[@class="olddata"][1]//td[@class="numeric"][1]');
$tr = $tr->item(0);
$trHTML = $tr->nodeValue;

演示:http://codepad.org/XmGPgrWp

您肯定应该看看DOMDocument->loadHTML((。

$doc = new DOMDocument();
$doc->loadHTML("<html><body><p id='"foo'">bar</p></body></html>");

$foo = $doc->getElementById('foo');
echo $foo; // Outputs 'bar'
$td = $doc->getElementsByTagName('td')->nodeValue;
echo $td; // Outputs your <td> value. In this case, nothing.

我认为您正在寻找PHP DOM扩展。或者,您可以使用正则表达式来匹配所需内容。