PHP和DOM:从子节点获取文本


PHP and DOM: getting text from a child node

我正在尝试使用PHP和DOM从元素的子节点获取文本数据。

这里是HTML数据我有麻烦解析。我正在尝试获取电子邮件地址。

<tr>
<th>Engineer:</th>
<td id="contact_person">Jack Smith &lt<a href='mailto:jsmith100@null.com'>jsmith100@null.com</a>&gt
    <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

更新:删除&lt&gt并用名称和电子邮件地址之间的连字符替换,返回以下内容:

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链接的事实。