我还在忙着学习 php 简单的 DOM,遇到了一个令人费解的场景。没有唯一的标签可以实际用来指定我想要的东西,它只是一大堆 <a>
标签。除了它们在评论之间分组的事实。
如果我做一个
foreach($html->find('comment a') as $a){
$articles[] = array($a->href,$a->innertext);
}
我得到了很多东西。那么有没有办法指定我想要所有 <a>
第一条和第二条评论之间的标签,第三条和第四条等等。 或者,DOM 不是最好的东西,在这样的情况下,它只是一团糟的 html。
片段:
<! FIRST COLUMN STARTS HERE>
<center><table CELLPADDING="3" WIDTH="100%"><tr>
<td ALIGN="LEFT" VALIGN="TOP" WIDTH="30%"><tt><b>
<A HREF="http://foo.bar">Text text text...</A><BR><BR>
谢谢
最佳答案
这是可能的,但最好考虑标签的顺序而不是它们的嵌套。
$articles = array(array());
foreach($html->find('comment, a') as $a) {
if ($a->nodetype == HDOM_TYPE_COMMENT) {
$articles[] = array();
} else {
$articles[count($articles) - 1][] = array($a->href,$a->innertext);
}
}
这段(相当粗略的)代码将创建一个数组数组,一个数组代表任何 <a>
s 在第一个评论之前,每个评论一个,每个数组包含零篇或多篇文章,具体取决于其评论与下一篇之间出现的链接数量。
顺便说一句,此代码不适用于您提供的代码片段,因为其中的注释以 <!
开头并以 >
结尾, 而不是 <!--
和 -->
, 分别。我假设评论在实际的 HTML 标记中正确显示。
编辑:好的,“评论”在片段中找到了。在这种情况下,simplehtml 似乎调用了以 <!
开头的所有其他标记。 :“未知”。因此,如果您将其添加到上面的代码中,您将拥有链接数组:
$articles = array(array());
foreach($html->find('comment, unknown, a') as $a) {
if (in_array($a->nodetype, array(HDOM_TYPE_COMMENT, HDOM_TYPE_UNKNOWN))) {
$articles[] = array();
} else {
$articles[count($articles) - 1][] = array($a->href,$a->innertext);
}
}
关于php - 比没有唯一标识符的 DOM 更好的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14471026/