使用str_replace处理HTML内容未生效,如何为img添加自闭合标签?
为啥你的str_replace没给img加上自闭合标签?
咱们先拆解核心问题:你的替换规则根本没匹配到目标内容!
看你给出的原字符串,img标签的结尾是这样的:
style="display: inline-block;"> </div>
注意>后面有个空格,才是</div>。但你的str_replace找的是"></div>"——也就是没有空格的组合,自然匹配不到,替换操作等于没执行。
另外,还有个隐藏坑:用简单的字符串替换处理HTML太脆弱了!毕竟你的内容来自AJAX POST参数,格式可能有各种变化(比如多几个空格、属性顺序变了、img后面不是直接跟</div>),下次再遇到类似情况,替换又会失效。
靠谱的解决方案:用DOMDocument处理(适配PHPWord需求)
要让PHPWord正常识别,最好用PHP的DOM解析类来处理HTML,这是最稳妥的方式,不会因为格式小变化翻车。
直接上代码:
$test = '<section><div class="row"> <div class="col-xs-12" data-type="container-content"> <section data-type="component-photo"><div class="photo-panel"> <img src="http://somewhere.com/XpV8lCLD6pChrysanthemum.jpg" width="100%" height="" style="display: inline-block;"> </div></section></div> </div></section>'; // 初始化DOM解析器 $dom = new DOMDocument(); // 关掉烦人的HTML格式警告 libxml_use_internal_errors(true); // 加载HTML,同时去掉默认添加的html/body标签 $dom->loadHTML($test, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); libxml_clear_errors(); // 找到所有img标签 $imgs = $dom->getElementsByTagName('img'); foreach ($imgs as $img) { // DOMDocument会自动处理自闭合,我们只需要确保它是空标签即可 // 或者直接用saveXML输出,它会自动把空标签转成自闭合格式 } // 输出处理后的内容,用saveXML保证自闭合格式正确 $new = $dom->saveXML($dom->documentElement); echo $new;
这个方法的好处:
- 不管HTML里的空格、属性顺序怎么变,都能精准定位所有img标签
- 输出的格式完全符合XML/HTML标准,PHPWord肯定能识别
- 避免了字符串替换的各种边界问题
如果你非要用字符串替换(不推荐)
要是你只想快速修复当前场景,可以调整替换规则,把空格考虑进去:
$new = str_replace('"> </div>', '"/> </div>', $test);
或者用正则表达式来兼容更多空格情况:
$new = preg_replace('/<img([^>]+)>\s*<\/div>/', '<img$1/> </div>', $test);
但还是要提醒:正则处理HTML始终有风险,比如万一img标签的属性里出现了>(虽然概率极低),正则就会匹配错误,所以优先选DOM解析的方式。
内容的提问来源于stack exchange,提问作者magicianiam
相关产品推荐
相关产品推荐

