php - 比没有唯一标识符的 DOM 更好的方法?

标签 php html simple-html-dom

我还在忙着学习 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/

相关文章:

php - 简单的 html dom 解析器 $html 为空

php - PHP 的 SOAP 库

php - 错误号 : 150 Foreign key constraint is incorrectly formed

javascript - 使用 slider 更新 THREE.Mesh.position onchange 事件

html - 使用基于屏幕分辨率的媒体查询从多个 css 文件中进行选择

php - 使用 simple-html-dom 获取图像 src

javascript - 使用 CSS 和 Javascript 将动画添加到 HTML DOM 对象的正确方法是什么?

php - 使用 if/else 语句检查 MySql 计数结果

php - 无法通过 OCI 插入度数字符 (°)

javascript - jQuery 在更改事件中获取 div prev