我正在尝试使用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和寻找任何指导…
最终更新:THE FIX:
$dom->getElementById("contact_person")->firstChild->nextSibling->nodeValue;
最终解决了这个问题:
$dom->getElementById("contact_person")->firstChild->nextSibling->nodeValue;
试试这样写:
$contact = $dom->getElementById("contact_person")->firstChild->nodeValue;
使用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
链接的事实。