DOMDocument缺少HTML标记

时间:2016-05-12 08:52:25

标签: php domdocument

我玩一款名为Tribalwars的在线游戏,现在我正在尝试编写一个报告解析器。典型的报告如下:

https://enp2.tribalwars.net/public_report/395cf3cc373a3b8873c20fa018f1aa07

我有两个从php.net改编的功能,现在看起来如下:

function has_child($p)
{
    if ($p->hasChildNodes())
    {
        foreach ($p->childNodes as $c)
        {
            if ($c->nodeType == XML_ELEMENT_NODE)
            {
                return true;
            }
        }
    }
    return false;
}

function show_node($x)
{
    foreach ($x->childNodes as $p)
    {
        if ($this->has_child($p))
        {
            $this->show_node($p);
        }
        elseif ($p->nodeType == XML_ELEMENT_NODE)
        {
            if (trim($p->nodeValue) !== '')
            {
                $temp = explode("\n", $p->nodeValue);
                if (count($temp) == 1)
                {
                    $this->reportdata[] = trim($temp[0]);
                }
                else
                {
                    foreach ($temp as $k => $v)
                    {
                        if (trim($v) !== '')
                        {
                            $this->reportdata[] = trim($v);
                        }
                    }
                }
            }
        }
    }
}

它以下列格式返回结果:

Array
(
    [0] => MASHAD (27000) attacks 40-014-Devil...
    [1] => May 11, 2016  19:27:12
    [2] => MASHAD has won
    [3] => Attacker's luck
    ...
    [76] => Espionage
    [77] => Resources scouted:
    [78] => Building
    ...
    [112] => Haul:
    [113] => .
    [114] => .
    [115] => .
    [116] => .
    [117] => .
    ...
    [120] => https://enp2.tribalwars.net/public_report/395...
)

在大多数情况下,这有效,但在解析时会丢失一些数据。如果你看一下链接上的报告,你会看到&#34;资源被发现&#34;和&#34;拖拉&#34;部分。顺便提一下,这两个部分都包含<span>。由于某些原因,函数返回的数组中缺少这两个部分。 (参见数组项77和数组项113-118)。第113-118行只显示奇怪格式化数字的.,第77行什么都没有。

在我调用show_node()函数的函数中,我做了一些处理以抛出不需要的不必要的DOM代码:

$temp = explode('<h1>Publicized report</h1>', $report[0]['reportdata']);
$rep = $temp[1];
$temp = explode('For quick copy and paste', $rep);
$rep = '<report>' . $temp[0] . '</report>';
$x = new DOMDocument();
$x->loadHTML($rep);
$this->show_node($x->getElementsByTagName('report')->item(0));

如果我在调用$rep函数之前输出show_node(),则会出现HaulResources scouted所需的信息。

可能是什么问题?

1 个答案:

答案 0 :(得分:0)

看起来好像DOMDocument对文档的深度有所限制。无论是上面的递归代码还是上面的递归代码都是错误的。因此,我已经确定了一段未被解析的代码,看到它是格式良好的,然后继续使用str_replace()删除了我不需要的子代,最终得到了我的值阵列。无论如何,这个问题现在已经解决了。