Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 包裹<;img>;<;部门>;但考虑到<;a>;标签_Php_Dom - Fatal编程技术网

Php 包裹<;img>;<;部门>;但考虑到<;a>;标签

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

我有一个函数,可以使用DOMDocument扫描字符串中的
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>