Php 包裹<;img>;<;部门>;但考虑到<;a>;标签
我有一个函数,可以使用DOMDocument扫描字符串中的Php 包裹<;img>;<;部门>;但考虑到<;a>;标签,php,dom,Php,Dom,我有一个函数,可以使用DOMDocument扫描字符串中的img标记,并将它们包装在div中 $str = 'string containing HTML'; $doc = new DOMDocument(); $doc->loadHtml(mb_convert_encoding($str, 'HTML-ENTITIES', 'UTF-8')); $tags = $doc->getElementsByTagName('img'); fore
img
标记,并将它们包装在div
中
$str = 'string containing HTML';
$doc = new DOMDocument();
$doc->loadHtml(mb_convert_encoding($str, 'HTML-ENTITIES', 'UTF-8'));
$tags = $doc->getElementsByTagName('img');
foreach ($tags as $tag) {
$div = $doc->createElement('div');
$tag->parentNode->insertBefore($div, $tag);
$div->appendChild($tag);
}
return $str;
但是,当img
被包装在a
标记中时,a
标记将被移除并用div
替换。如何保留a
标签
目前,
<a href="http://google.com"><img src="srctoimg"/></a>
导致
<div><img src="srctoimg"/></div>
而不是
<div><a href="http://google.com"><img src="srctoimg"/></a></div>
是否有一个“通配符”可以与第二个参数一起传递,或者如何实现这一点?使用
if
子句可能最简单:
foreach ($tags as $tag) {
$div = $doc->createElement('div');
$x = $tag->parentNode;
// Parent node is not 'a': insert before <img>
if($tag->parentNode->tag != 'a') {
$tag->parentNode->insertBefore($div, $tag);
}
// Parent node is 'a': insert before <a>
else{
$tag->parentNode->parentNode->insertBefore($div, $tag);
}
$div->appendChild($tag);
}
foreach($tags作为$tag){
$div=$doc->createElement('div');
$x=$tag->parentNode;
//父节点不是“a”:在之前插入
如果($tag->parentNode->tag!=“a”){
$tag->parentNode->insertBefore($div,$tag);
}
//父节点为“a”:在之前插入
否则{
$tag->parentNode->parentNode->insertBefore($div,$tag);
}
$div->appendChild($tag);
}
在您的foreach中尝试使用此功能
$parent = $tag->parentNode;
if( $parent->tagName == 'a' )
{
$parent->parentNode->insertBefore($div, $parent);
$div->appendChild($parent);
}
else
{
$tag->parentNode->insertBefore($div, $tag);
$div->appendChild($tag);
}
您可以通过XPath查询实现这一点
'//*[img/parent::a or (self::img and not(parent::a))]'
这将为任何img
标记(具有a
父项)获取父项,以及任何img
标记(不具有立即a
父项)获取任何图像标记本身
这样,您就不必更改循环中的代码
$str = <<<EOS
<html>
<body>
Image with link:
<a href="http://google.com">
<img src="srctoimg"/>
</a>
Image without link:
<img src="srctoimg"/>
</body>
</html>
EOS;
$doc = new DOMDocument();
$doc->loadHtml(mb_convert_encoding($str, 'HTML-ENTITIES', 'UTF-8'));
$xpath = new DOMXPath($doc);
$tags = $xpath->query(
'//*[img/parent::a or (self::img and not(parent::a))]'
);
foreach ($tags as $tag) {
$div = $doc->createElement('div');
$tag->parentNode->insertBefore($div, $tag);
$div->appendChild($tag);
}
echo $doc->saveHTML();
$str=createElement('div');
$tag->parentNode->insertBefore($div,$tag);
$div->appendChild($tag);
}
echo$doc->saveHTML();
输出(为清晰起见缩进):
带链接的图像:
没有链接的图像:
使用xpath
$str = 'string containing HTML';
$doc = new DOMDocument();
$doc->loadHtml(mb_convert_encoding($str, 'HTML-ENTITIES', 'UTF-8'));
$xpath = new DOMXPath($doc);
$tags0 = $xpath->query('//a/img'); // get all <img> in <a> tag
$tags1 = $xpath->query('//img[not(parent::a)]'); // get all <img> except those with parent <a> tag
$tags = array_merge($tags0,$tags1); // merge the 2 arrays
foreach ($tags as $tag) {
$div = $doc->createElement('div');
$tag->parentNode->insertBefore($div, $tag);
$div->appendChild($tag);
}
return $str;
$str='string containing HTML';
$doc=新的DOMDocument();
$doc->loadHtml(mb_convert_编码($str,'HTML-ENTITIES','UTF-8');
$xpath=新的DOMXPath($doc);
$tags0=$xpath->query('//a/img');//全力以赴
$tags1=$xpath->query('//img[not(parent::a)]);//获取除具有父标记的以外的所有
$tags=array_merge($tags0,$tags1);//合并两个数组
foreach($tags作为$tag){
$div=$doc->createElement('div');
$tag->parentNode->insertBefore($div,$tag);
$div->appendChild($tag);
}
返回$str;
您好,我使用jquery提供此解决方案。我知道你用php问这个问题
<a href="http://google.com"><img src="srctoimg"/></a>
<script src="http://code.jquery.com/jquery-1.11.2.min.js"></script>
<script>
$('a').replaceWith(function(){
return $('<div/>', {
html: this.innerHTML
})
})
</script>
$('a').replaceWith(函数(){
返回$(''){
html:this.innerHTML
})
})
if语句行nope上有“Notice:Undefined property:domeElement::$tag in…”,1)insertbefore parent,child is parent,2)insert before tag,child is tag,它就在文本my error上,我必须将答案和alexs合并在一起才能在我的情况下工作。那么insertbefore inserts基于调用函数的父函数吗?文档中有相反的说法,或者合并是什么?我在PHP5.3中尝试了你的代码,效果很好。我想问题出在别的地方了。
<a href="http://google.com"><img src="srctoimg"/></a>
<script src="http://code.jquery.com/jquery-1.11.2.min.js"></script>
<script>
$('a').replaceWith(function(){
return $('<div/>', {
html: this.innerHTML
})
})
</script>