所以我使用代码从网站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>
标签的卡片。
答案 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)
。