如何使用PHP的DOMDocument类获取元素下所有带内容的子标签
实现方法
可以通过遍历目标节点的子节点、过滤空内容节点的方式实现,不需要提前知道内部嵌套的标签类型。
你之前用nodeValue只能拿到纯文本,是因为该属性本身的设计就是将节点及其所有后代的文本内容拼接为纯字符串返回,不会保留元素结构。
完整可运行代码
$doc = new DOMDocument(); $el = "<td><a href='http://google.hr'>test1</a><div>Test2</div></td>"; // 加载HTML片段,添加参数禁止libxml自动补全html、body标签,同时抑制无效标签警告 @$doc->loadHTML($el, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); $targetTd = $doc->getElementsByTagName("td")->item(0); $validChildren = []; foreach ($targetTd->childNodes as $child) { // 过滤规则:仅保留元素节点,且去除首尾空白后内容不为空 if ($child->nodeType === XML_ELEMENT_NODE && trim($child->nodeValue) !== '') { // 可按需获取元素的各类属性,以下为示例取值 $validChildren[] = [ '标签名' => $child->tagName, '文本内容' => $child->nodeValue, '完整HTML' => $doc->saveHTML($child) ]; } } // 输出验证结果 print_r($validChildren);
扩展说明
如果需要获取<td>下所有深层嵌套的带内容元素(不止直接子元素),将上述遍历逻辑改为递归遍历即可,过滤规则保持不变。
内容的提问来源于stack exchange,提问作者Slit
相关产品推荐
相关产品推荐

