2016-04-28 169 views
1

我的功能需要从HTML代码的一部分获得所有第一级HTML标签,以便我可以使用每个HTML代码。PHP&Xpath:获取所有第一级HTML标签(所有兄弟)

这是我的HTML文档总结如下:

<p>The breed was first...</p> 
<p>Semencic credits his...</p> 

<h1>Appearance</h1> 
<p>The breed's distinctive...</p> 
<p>It should be symmetrical...</p> 

<figure id="attachment_6" style="width: 840px" class="wp-caption alignnone"> 
    <img class="size-large wp-image-6" src="...jpg" alt="boerboel appearance" width="840" height="746"> 
    <figcaption class="wp-caption-text">The dog appearance.</figcaption> 
</figure> 

<h1>Requirements</h1> 
<p>Prospective owners....</p> 
<p>These dogs....</p> 

<h2>A Little Warning!</h2> 
<p>If you are considering...</p> 
<blockquote> 
    <p>According to...</p> 
    <p>Source: http://...</p> 
</blockquote> 
<p>Although more suitable...</p> 

现在,我想我的输出是:

p 
p 
h1 
p 
p 
figure 
h1 
p 
p 
h2 
p 
blockquote 
p 

但现在,它是:

h1 
p 
h1 
p 
h2 
p 
blockquote 
p 

有有几件事是错误的: - '图'没有显示 - 标准杆阿格拉夫标签单挑,即使有几个兄弟姐妹 - 第一p的都没有发现

$doc = new DOMDocument(); 
$doc->loadHTML($this->post_content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 

$xpath = new DOMXpath($doc); 
$nodes = $xpath->query("/*/*"); 

foreach ($nodes as $node) { 

    echo $node->nodeName; 
    echo '<br>'; 

    $this->add_part(
     md5($node->textContent), 
     $node->nodeName 
    ); 
} 
+1

我认为你必须发布真实的HTML代码。您的代码适用于我,使用由标签包装的HTML样本。 – fusion3k

+0

我的html代码是真正的html代码,没有标签包装所有这一切。 – Lazhar

回答

0

DOM(libxml的)将重新格式化输入,所以它具有单个文档元素。如果删除解析器选项(LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD),它将修复该html并添加htmlbody元素。所以,如果你想里面body元素节点可以使用表达//body/*

$document = new DOMDocument(); 
$document->loadHtml($html); 
$xpath = new DOMXpath($document); 

foreach ($xpath->evaluate('//body/*') as $node) { 
    var_dump($node->nodeName); 
} 

输出:

string(1) "p" 
string(1) "p" 
string(2) "h1" 
string(1) "p" 
string(1) "p" 
string(6) "figure" 
string(2) "h1" 
string(1) "p" 
string(1) "p" 
string(2) "h2" 
string(1) "p" 
string(10) "blockquote" 
string(1) "p" 
0

对于记录:您精确的HTML示例中,我得到这样的结果:

p/h1/p/p/figure/h1/p/p/h2/p/blockquote/p 

代替这个(根据你的问题):

h1/p/   h1/p/ h2/p/blockquote/p 

3v4l.org demo

所以,我不知道这个答案是否能解决你的问题在真正的代码。


HTML有一些规则。您尝试处理没有根元素的代码。总结的东西你的代码像<body>

$doc->loadHTML("<body>$txt</body>", LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 

通过这种方式,我得到你想要的结果:

p 
p 
h1 
p 
p 
figure 
h1 
p 
p 
h2 
p 
blockquote 
p 

3v4l.org demo

+0

如果这个解决方案不起作用,您可以打印' - > post_content'并向我们展示结果(从页面源中复制它,而不是从渲染的页面或检查器复制)? – fusion3k

相关问题