3

我还在纠结于学习 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>

谢谢

4

1 回答 1

0

这是可能的,但考虑标签的顺序而不是它们的嵌套可能会更好。

$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);
    }
}
于 2013-01-23T12:35:28.083 回答