如何用纯文本替换多个img元素?

时间:2017-10-14 13:46:00

标签: php html dom domdocument

我想创建一个输出文本过滤器,用以下文字替换DOM中的所有<img>元素&#34; no images allowed&#34;。

即:如果用户创建此HTML标记:

<p><img src="/image.jpg" /></p>

呈现以下HTML:

<p>no images allowed</p>

请注意,我无法使用preg_replace。问题已经简化,我需要解析DOM以找到不允许的图像。

感谢this answer,我发现getElementsByTagName()返回&#34;直播&#34;迭代器,所以你需要两个步骤,所以我有这个:

foreach ($elements as $element) {
  $domArray[] = $element;
  $src= $element->getAttribute('src');
  $frag= $dom->createElement('p');
  $frag->nodeValue = 'no images allowed';
  $element->parentNode->appendChild($frag);
}
// loop through the array and delete each node
$nodes = iterator_to_array($dom->getElementsByTagName('img'));
foreach ($nodes as $node) {
  $node->parentNode->removeChild($node);
}
$newtext = $dom->saveHTML();

几乎做我想做的事,但我明白了:

<p><p>no images allowed</p></p>

2 个答案:

答案 0 :(得分:2)

要删除HTML自我封闭的img标记,您可以使用简单的正则表达式:

<?php

function no_images_allowed($text) {
    return preg_replace('/<img[^>]*>/', 'no images allowed', $text);
}

print no_images_allowed('<p><img src="/image.jpg" /></p>');

它更简单,效率更高,您不需要遍历每个DOM元素,只需处理纯文本。

上面示例中的正则表达式仅适用于自封闭的img标记:

<img src="..."/>
<img src="...">

请注意,它不适用于例如:

<img src="..."></img>
<IMG SRC="..."/>
<img src="...">invalid content</img>

如果要包含所有可能的情况(即使是无效的情况),则应修改提议的正则表达式。

答案 1 :(得分:2)

我将使用xpath获取元素,然后替换为新创建的文本节点。

$xp = new DOMXPath($dom);
$elements = $xp->query('//img');
foreach ($elements as $element) {
  $frag= $dom->createTextNode('no images allowed');
  $element->parentNode->insertBefore($frag, $element);
  $element->parentNode->removeChild($element);
}
echo $dom->saveHtml();

在这里演示:http://codepad.org/w9uj0ez9