【问题标题】:php Xpath getting innerHTML with innerHTML tagsphp Xpath使用innerHTML标签获取innerHTML
【发布时间】:2011-12-13 06:19:00
【问题描述】:

我有一个格式如下的 HTML 文件:

<p class="p1">subject</p>
<p class="p2">detail <span>important</span></p>

<p class="p1">subject</p>
<p class="p2">detail<span>important</span></p>

我编写了一个 PHP 代码来自动获取每个 p1,并将它们插入到我的 mysql 表中。

这是我的代码:

$doc = new DOMDocument();

$doc->loadHTMLFile("file.html");

$xpath = new DomXpath($doc);

$subject = $xpath->query('//p');


for ($i = 0 ; $i < $subject->length-1 ; $i ++) {

if ($subject->item($i)->getAttribute("class") == "p1")
    echo $subject->item($i)->nodeValue;
}
...

这不是我的完整代码,但问题是:

echo $subject->item($i)->nodeValue;

这给了我&lt;p&gt;detail important&lt;/p&gt;,没有&lt;span&gt;&lt;/span&gt; 标签。

在细节的“重要”部分周围放置 span 标签非常重要。有什么功能可以做到不头痛吗?

提前致谢

【问题讨论】:

标签: php html xpath


【解决方案1】:

我找到了问题的答案 :) 感谢 SimpleHTMLDOM

foreach($html->find('p') as $element) {

 switch ($element->class) {
      case 'p1':
                     $subject = $element;
                     break;
      case 'p2': $detail .= html_entity_decode($element);

 }

}

诀窍在于:

html_entity_decode($element);

【讨论】:

    【解决方案2】:

    每当我需要解析 HTML 时,我都会通过 SimpleHTMLDOM 运行它:

    http://simplehtmldom.sourceforge.net/

    我建议使用 1.11 版本。由于各种原因,1.5 相当损坏。

    【讨论】:

    • SimpleHTMLDOM 在设计上存在缺陷,因此我不推荐它,而是基于 DomDocument 的东西,另请参阅:stackoverflow.com/questions/3606792/…
    • 这里也有同样的问题。它只有 $element->plaintext。所以如果元素中有任何标签,它将被提取为纯文本:(
    【解决方案3】:

    旧查询,但有一个单行。 OP应该使用:

    $subject = $xpath-&gt;query('//p/*');

    然后:

    echo $doc-&gt;saveHtml($subject-&gt;item($i));

    使用*,您将获得内部html(没有包装段落标签);如果没有 *,您将获得带有包装段落的 html;

    完整示例:

    $html = '<div><p>ciao questa è una <b>prova</b>.</p></div>';
    $dom = new DomDocument($html);
    @$dom->loadHTML($html);
    $xpath = new DOMXPath($dom);
    $node = $xpath->query('.//div/*'); // with * you get inner html without surrounding div tag; without * you get inner html with surrounding div tag
    $innerHtml = $dom->saveHtml($node);
    var_dump($innerHtml);
    

    输出:&lt;p&gt;ciao questa è una &lt;b&gt;prova&lt;/b&gt;.&lt;/p&gt;

    【讨论】:

      猜你喜欢
      • 2020-12-14
      • 1970-01-01
      • 2020-09-04
      • 2012-06-09
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      相关资源
      最近更新 更多