将<img>元素包装在<div>中,但允许使用<a>标签

我有一个img使用DOMDocument扫描字符串中的标签并将它们包装在中的函数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>

是否可以通过第二个参数传递“通配符”,insertBefore()或者如何实现?

您可以使用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();

输出(为清楚起见缩进):

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<body>
    Image with link:
    <div>
        <a href="http://google.com">
            <img src="srctoimg">
        </a>
    </div>

    Image without link:
    <div>
        <img src="srctoimg">
    </div>
</body>
</html>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将表格包装在div中

来自分类Dev

如何配置CKEditor以允许将html块级标签包装在锚标签中

来自分类Dev

将生成的标签包装在分开的div上

来自分类Dev

如何用div标签包装img元素

来自分类Dev

如何将img宽度的百分比包装在特定的div宽度中?

来自分类Dev

使用jQuery将img包装在div中

来自分类Dev

将现有的SVG元素包装在G标签中

来自分类Dev

如何将<a> <img> </a>标签与div对齐

来自分类Dev

根据相同的值将数组元素包装在div中

来自分类Dev

Beautiful Soup返回包装在<div>标签中的元素。我如何剥离它们?

来自分类Dev

如何在某个元素之后将所有元素包装在div中?(jQuery的)

来自分类Dev

使用jQuery将标签包装在现有<li>元素内的项目周围

来自分类Dev

将每个导航元素包装在div中是否合适?

来自分类Dev

如何使用jQuery将所有HTML元素包装在DIV中,具体取决于这些HTML元素的总高度?

来自分类Dev

TinyMCE-将多个元素包装在一个div中

来自分类Dev

相邻的JSX元素包装在结束标签中时,必须包装在包装标签错误中

来自分类Dev

计算div标签中img标签的数量

来自分类Dev

将元素的内容包装在“ .content” div中

来自分类Dev

将内容包装在父元素中

来自分类Dev

Wicket将img元素包装在链接中

来自分类Dev

如何使用JavaScript从div标签中获取img元素?

来自分类Dev

CSS:将IMG标签放置在div中且溢出

来自分类Dev

将<img>元素包装在<div>中,但允许使用<a>标签

来自分类Dev

大型XML文件-使用XSLT或通过将XML操纵为String来将元素包装在标签内?

来自分类Dev

排序后如何将数组元素包装在html标签中?

来自分类Dev

将 2 种元素类型的每次迭代包装在单独的包装器 div 中

来自分类Dev

如何将子元素包装在父标签中?

来自分类Dev

检测图像 URL 并包装在 IMG 标签中?

来自分类Dev

通过“jQuery方法”创建元素后如何将元素包装在div中?

Related 相关文章

  1. 1

    将表格包装在div中

  2. 2

    如何配置CKEditor以允许将html块级标签包装在锚标签中

  3. 3

    将生成的标签包装在分开的div上

  4. 4

    如何用div标签包装img元素

  5. 5

    如何将img宽度的百分比包装在特定的div宽度中?

  6. 6

    使用jQuery将img包装在div中

  7. 7

    将现有的SVG元素包装在G标签中

  8. 8

    如何将<a> <img> </a>标签与div对齐

  9. 9

    根据相同的值将数组元素包装在div中

  10. 10

    Beautiful Soup返回包装在<div>标签中的元素。我如何剥离它们?

  11. 11

    如何在某个元素之后将所有元素包装在div中?(jQuery的)

  12. 12

    使用jQuery将标签包装在现有<li>元素内的项目周围

  13. 13

    将每个导航元素包装在div中是否合适?

  14. 14

    如何使用jQuery将所有HTML元素包装在DIV中,具体取决于这些HTML元素的总高度?

  15. 15

    TinyMCE-将多个元素包装在一个div中

  16. 16

    相邻的JSX元素包装在结束标签中时,必须包装在包装标签错误中

  17. 17

    计算div标签中img标签的数量

  18. 18

    将元素的内容包装在“ .content” div中

  19. 19

    将内容包装在父元素中

  20. 20

    Wicket将img元素包装在链接中

  21. 21

    如何使用JavaScript从div标签中获取img元素?

  22. 22

    CSS:将IMG标签放置在div中且溢出

  23. 23

    将<img>元素包装在<div>中,但允许使用<a>标签

  24. 24

    大型XML文件-使用XSLT或通过将XML操纵为String来将元素包装在标签内?

  25. 25

    排序后如何将数组元素包装在html标签中?

  26. 26

    将 2 种元素类型的每次迭代包装在单独的包装器 div 中

  27. 27

    如何将子元素包装在父标签中?

  28. 28

    检测图像 URL 并包装在 IMG 标签中?

  29. 29

    通过“jQuery方法”创建元素后如何将元素包装在div中?

热门标签

归档