由于<i>标记</i>而导致消息未找到错误的异常

时间:2013-08-13 16:01:22

标签: php dom

所以我使用代码从网站gatherer.wizards.com获取信息。 在这些信息中,我需要用文本替换图像,一切顺利,直到某些卡片中的图像显示在<i>标签内。

以下是我正在使用的代码:

$textDiv = $xpath->query('...');

$text = '';
foreach ($textDiv as $textPart)
{
    $l = $textPart->getElementsByTagName('img')->length;
    for ($i = 0; $i < $l; $i++)
    {
        $search  = array('/Handlers/Image.ashx?size=small&name=','&type=symbol');
        $replace = array('{','}');
        $src = str_replace($search, $replace, $textPart->getElementsByTagName('img')->item(0)->getAttribute('src'));
        $newNode = $doc->createTextNode($src);
        $textPart->replaceChild($newNode, $textPart->getElementsByTagName('img')->item(0));
    }
    $text .= $textPart->textContent."\n";

对于大多数卡片而言,它正如我所需要的那样工作。但每次卡片在<i>内都有一张图片(这是我目前遇到的唯一一张图片),我收到以下错误:

  

致命错误:未捕获异常'DOMException',消息'未找到错误'在...... php:60堆栈跟踪:#0 ... php(60):DOMNode-&gt; replaceChild(Object(DOMText),Object (一个DOMElement));

第60行是我使用replaceChild的行。

我搜索过并发现有人说使用$textPart->nodeParent->replaceChild可以解决这个问题,但对我来说并非如此。

对于任何可以提供帮助的人来说,如果你们需要更多信息请告诉我。

此链接是代码工作的卡片:

http://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=2

此链接是代码不起作用的卡片:

http://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=370618

我查了几张卡片,有问题的卡片总是带有<i>标签的卡片。

1 个答案:

答案 0 :(得分:3)

在这种情况下,

$textPart->getElementsByTagName('img')->item(0)不是$textPart的直接孩子(它是孙子,甚至更远)。您可以通过every DOMNode has a ->parentNode property

这一事实解决这个问题,而不必过多考虑实际布局
$node = $textPart->getElementsByTagName('img')->item(0);
$node->parentNode->replaceChild($newNode, $node);

...这也为您带来了额外的好处,即每个循环只需调用一次getElementsByTagName()->item(0)