PHP使用DOMDocument解析HTML时如何将a标签插入到mark标签内部
问题根因
你的代码问题出在节点挂载逻辑错误:当前调用$dom->appendChild($gear)是将新建的a标签追加到整个DOM文档的根层级,自然会出现在所有内容末尾,而非你期望的标签内部。
修改后可直接运行的代码
$str = $attributes["description_text"]; // HTML string $dom = new DOMDocument; // 加载HTML时添加参数,避免自动生成DOCTYPE、html、body等多余标签 $dom->loadHTML($str, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); $items = $dom->getElementsByTagName('mark'); $gear = $dom->createElement('a', "Lorem ipsum dolor sit amet"); // 先判断是否存在匹配的mark标签,避免空节点报错 if ($items->length > 0) { // 取第一个匹配的mark标签,将a节点追加到它内部 $markNode = $items->item(0); $markNode->appendChild($gear); } $output_dom = $dom->saveHTML(); return '<p>'. $output_dom .'</p>';
核心改动说明
- 加载HTML时添加
LIBXML_HTML_NOIMPLIED和LIBXML_HTML_NODEFDTD两个Libxml参数,避免DOMDocument自动补充html、body、DOCTYPE等冗余标签 - 不再把a标签挂载到DOM根节点,而是先取出查询到的节点,将a标签作为子节点挂载到内部,即可实现a标签嵌套在里的效果
- 增加了节点存在性判断,避免页面中没有mark标签时抛出语法错误
内容的提问来源于stack exchange,提问作者la_petite_kozel
相关产品推荐
相关产品推荐

