如何用纯文本替换多个 img 元素?
How can i replace a multiple img-elements with plain text?
我想创建一个输出文本过滤器,以将 DOM 中的所有 <img>
元素替换为以下文本“no images allowed
”。
即:如果用户创建此 HTML 标记:
<p><img src="/image.jpg" /></p>
呈现以下 HTML:
<p>no images allowed</p>
请注意,我无法使用 preg_replace
。问题被简化了,我需要解析 DOM 以找到不允许使用的图像。
感谢this answer,我发现getElementsByTagName()
returns "live"迭代器,所以你需要两步,所以我有这个:
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>
要删除 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>
如果您想包括所有可能的情况(甚至无效的情况),则应修改建议的正则表达式。
我会用 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();
我想创建一个输出文本过滤器,以将 DOM 中的所有 <img>
元素替换为以下文本“no images allowed
”。
即:如果用户创建此 HTML 标记:
<p><img src="/image.jpg" /></p>
呈现以下 HTML:
<p>no images allowed</p>
请注意,我无法使用 preg_replace
。问题被简化了,我需要解析 DOM 以找到不允许使用的图像。
感谢this answer,我发现getElementsByTagName()
returns "live"迭代器,所以你需要两步,所以我有这个:
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>
要删除 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>
如果您想包括所有可能的情况(甚至无效的情况),则应修改建议的正则表达式。
我会用 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();