RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 774020
Accepted
Raz Galstyan
Raz Galstyan
Asked:2020-01-22 18:50:26 +0000 UTC2020-01-22 18:50:26 +0000 UTC 2020-01-22 18:50:26 +0000 UTC

php DomDocument 中的 getElementsByTagName 问题

  • 772

有一个代码php。我在帮助下DOMDocument搜索所有标签,img然后遍历它们并进行更改。

问题是html我正在使用的那个有 5 个标签img。并且循环经过3次。

可能是什么问题呢?

$dom = new DOMDocument();
$dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

$imgs_t = $dom->getElementsByTagName('img');
$amp_img_src = '/images/front/what_is_dt_video.jpg';
$count_foreach = 0;
foreach( $imgs_t as $img_t ){
    $count_foreach++;
    $img_alt = '';
    $tmp_img_src = $img_t->getAttribute('src');
    $img_alt = $img_t->getAttribute('alt');

    if($tmp_img_src != $amp_img_src){                
        $tmp_amp_img = $dom->createElement('amp-img');
        $tmp_amp_img->setAttribute('width', 200);
        $tmp_amp_img->setAttribute('height', 200);
        $tmp_amp_img->setAttribute('src', $tmp_img_src);
        $tmp_amp_img->setAttribute('alt', $img_alt);

        $img_t->parentNode->replaceChild($tmp_amp_img, $img_t);
    }
}
var_dump($count_foreach);

这正是代码开头html变量中包含的那个。$htmlphp

<div class="what_is_dt drop_down_pg">
    <div class="drop_down_video drop_down_cont">
        <div class="col-sm-7 col-xs-12">
            <div class="video_wrap">
                <div id="ntx_dt_info_video_link" class="no-padding">
                    <img src="/images/front/what_is_dt_video.jpg" height="315px" width="481px" alt="Lorem ipsum">
                </div>
                <div class="what_fx_video_head">
                    <span>Lorem ipsum</span>
                </div>
            </div>
        </div>
        <div class="col-sm-5 col-xs-12 no-padding">

            <span class="background_green">

                <h2>Lorem ipsum</h2>
                <p><em>Lorem ipsum</em></p>
                <p><em>Lorem ipsum</em></p>
            </span>
            [T]CONFIRM_THEORY[/T]
        </div>
        [T]CONFIRM_THEORY_MOBILE[/T]
        <hr />
    </div>
    <h2 style="margin-top: 40px;"><strong>Lorem ipsum</strong></h2>
    <div style="padding-top: 30px;">
        <div class="signature-left col-lg-6 col-md-6 col-sm-6 col-xs-12">
            <img src="/uploads/docs/th%20Failure%20Swing.png" alt="Lorem ipsum" title="Lorem ipsum" width="200" height="200" />
            <span style="font-size: small;"> <strong>Lorem ipsum.</strong></span>
            <span style="font-size: small;">Lorem ipsum. </span>
        </div>
        <div class="signature-left col-lg-6 col-md-6 col-sm-6 col-xs-12">
            <img src="/uploads/docs/th%20Nonfailure%20Swing.png" alt="Lorem ipsum" width="200" height="200"/>
            <span style="font-size: small;"><strong>Lorem ipsum.</strong> </span>
            <span style="font-size: small;">Lorem ipsum.</span>
        </div>
    </div>
    <p style="clear: both; padding-top: 30px;" >Lorem ipsum.</p>
    <div style="padding-top: 30px;">
        <div class="signature-left col-lg-6 col-md-6 col-sm-6 col-xs-12">
            <img src="/uploads/docs/th Failure Swing Bottom.png" alt="" />
            <p><span style="font-size: small;"><strong>Failure Swing </strong>Lorem ipsum.</span></p>
        </div>
        <div class="signature-left col-lg-6 col-md-6 col-sm-6 col-xs-12">
            <img src="/uploads/docs/th Nonfailure Swing Bottom.png" alt="Lorem ipsum" width="200" height="200" />
            <p><span style="font-size: small;"><strong>Nonfailure Swing</strong>Lorem ipsum.</span></p>
        </div>
    </div>
    <p style="clear: both;"><br /></p>
    [T]OUR_LEARNING[/T]
</div>
php
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    teran
    2020-01-22T21:21:07Z2020-01-22T21:21:07Z

    一般来说,如果简化为最小示例,问题看起来像这样。

    $html = <<<HTML
        <div class="what_is_dt drop_down_pg">       
            <img src="1">
            <img src="2">
            <img src="3">
            <img src="4">
            <img src="5">
        </div>
    HTML;
    
    $dom = new DOMDocument();
    $dom->loadHTML($html);
    
    $imgs_t = $dom->getElementsByTagName('img');
    print_r($imgs_t);
    
    $amp_img_src = '/images/front/what_is_dt_video.jpg';
    $count_foreach = 0;
    foreach( $imgs_t as $img_t ){
        $count_foreach++;
        $tmp_img_src = $img_t->getAttribute('src');
    
        print_r([$count_foreach, $tmp_img_src]);
    
        if($tmp_img_src != $amp_img_src){
            $tmp_amp_img = $dom->createElement('amp-img');
            $img_t->parentNode->replaceChild($tmp_amp_img, $img_t);
        }
    }
    

    这里发生了什么。你找到所有 5 个元素。你开始扫荡。在第一次迭代中,满足条件并替换第一个节点。那么应该有一个过渡到原来集合的第二个节点,但是我们已经改变了它,现在改变集合的第二个节点将对应到原来的第三个节点。因此,原始节点的第二个节点可以说是丢失了。我无法完全解释如何以及什么中断,但问题是关于迭代器的实现。

    通常,如果您以相反的顺序浏览此集合,则可以更改结构。这里,原则上,这样一个循环删除数组元素的经典问题,如果你delete,按相反的顺序处理,那么删除节点不会影响对尚未处理的元素数组的索引

    $len = $imgs_t->length;
    
    for($i = $len-1; $i >=0 ; $i--){
        $count_foreach++;
        $img_t = $imgs_t->item($i);
        ...  
    }
    

    如果我们想象我们的收藏是

    A B C D E 
    

    执行第一次迭代。迭代器索引0,元素А。我们删除这个元素,集合变成

    B C D E
    

    我们继续进行新的迭代,迭代器计数器一无所知,并且增加了1. 提取此元素并获得C. 结果,我们得到,由于第一个元素的删除(替换),我们丢失了元素B。如果以相反的顺序处理集合,则不会出现此问题。

    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5