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

时间:2015-09-25 00:19:11

标签: php dom

我正在尝试使用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并寻求任何指导......

最终更新:修正:

$dom->getElementById("contact_person")->firstChild->nextSibling->nodeValue;

3 个答案:

答案 0 :(得分:1)

这最终解决了这个问题:

$dom->getElementById("contact_person")->firstChild->nextSibling->nodeValue;

答案 1 :(得分:0)

尝试类似:

$contact = $dom->getElementById("contact_person")->firstChild->nodeValue;

答案 2 :(得分:0)

使用XPath查询而不是使用firstChildnextSibling等可能更可靠。

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