我正在尝试使用PHP和DOM从元素的子节点获取文本数据。
这是我在解析时遇到问题的HTML数据。我正在尝试获取电子邮件地址。
<tr>
<th>Engineer:</th>
<td id="contact_person">Jack Smith <<a href='mailto:jsmith100@null.com'>jsmith100@null.com</a>>
<table class='transparent'>
<tr>
<td>Work Phone</td>
<td>(555) 555-5555</td>
</tr>
</table>
</td>
这是我当前处理该元素的代码:
$contact = $dom->getElementById("contact_person")->nodeValue;
这是我得到的结果:
Jack Smith Work Phone(555) 555-5555
更新:删除<
和>
并替换名称和电子邮件地址之间的单个连字符将返回以下内容:
Jack Smith - jsmith100@null.comWork Phone(555) 555-5555
这就是我想要的:
jsmith100@null.com
我试图让开发人员将“id = contact_person”移动到包含电子邮件地址的锚点。我在测试中做的事情很好,但在我们的系统中是不可能的。
我确信这很明显,但我并不熟悉DOM并寻求任何指导......
最终更新:修正:
$dom->getElementById("contact_person")->firstChild->nextSibling->nodeValue;
答案 0 :(得分:1)
这最终解决了这个问题:
$dom->getElementById("contact_person")->firstChild->nextSibling->nodeValue;
答案 1 :(得分:0)
尝试类似:
$contact = $dom->getElementById("contact_person")->firstChild->nodeValue;
答案 2 :(得分:0)
使用XPath查询而不是使用firstChild
,nextSibling
等可能更可靠。
$xpath = new DOMXPath($dom);
$node = $xpath->query("//*[@id='contact_person']//a[contains(@href,'mailto:')]")->item(0);
if( $node) {
$email = $node->nodeValue;
}
else {
$email = "NOT FOUND";
}
这将查找包含“mailto”的任何链接,无论它位于#contact_person
内的哪个位置。这意味着它不再依赖于精确的结构,只依赖于容器的ID以及它是mailto
链接的事实。