Php 基于html注释的高级正则表达式帮助

Php 基于html注释的高级正则表达式帮助,php,html,regex,Php,Html,Regex,我试图使用SimpleHTMLDOM解析下面的html块,但未能从中获取全名和电子邮件,因为页面使用相同的表结构,不同的内容块没有任何id或类名,但幸运的是页面在每个表之前使用不同的注释。例如 <!-- Showing Buyer Details --> <table style="table-layout:fixed; width:100%; border: 1px solid #0000CD; border-collapse:collapse; margin: 0px; f

我试图使用SimpleHTMLDOM解析下面的html块,但未能从中获取全名和电子邮件,因为页面使用相同的表结构,不同的内容块没有任何id或类名,但幸运的是页面在每个表之前使用不同的注释。例如

<!-- Showing Buyer Details -->
<table style="table-layout:fixed; width:100%; border: 1px solid #0000CD; border-collapse:collapse; margin: 0px; font-family: Arial,Helvetica; font-size: 10pt;background-color: #FFFFFF; margin-left:auto; margin-right:auto " class="">
    <tbody class=""><tr class=""><td style="border:solid 1px #0000CD;padding: 5px; font-weight:bold" class="">Showing Buyer Details</td></tr>
    <tr class=""><td style="padding: 5px;" class="">
        <table border="0" style="font-family: Arial,Helvetica; font-size: 10pt;" class="">
                <tbody class=""><tr class=""><td valign="top" class=""><b class="">FULL NAME</b></td></tr>

                <tr class=""><td valign="top" class="">ADDRESS GOES HERE</td></tr>
                        <tr class="">
                <td valign="top" class="">(123) 456-7890</td>

            </tr>
                            <tr class=""><td valign="top" class="">(321) 098-0123 (Office Main Line)</td></tr>
                            <tr class="">
                    <td valign="top" class=""><a href="mailto:email@test.com" class="">email@test.com</a></td>

                </tr>
        </tbody></table>
    </td></tr>
</tbody></table>

显示买家详细信息
全名
地址在这里
(123) 456-7890
(321)098-0123(办公主线)

我想得到全名和电子邮件地址使用正则表达式或一些好的。这对我来说是非常先进的,所以我将感谢任何真正的帮助。非常感谢。

您可以尝试通过正则表达式选择表

/<!-- Showing Buyer Details -->\s*(.+<\/table>\s*<\/td>\s*<\/tr>\s*<\/tbody>\s*<\/table>)/s

看起来你需要从表中找到正确的部分,然后是其中的电子邮件地址。我不会骗你的,使用类和HTML文档的其余部分会更容易

从获取所有td元素开始,找到带有短语“显示买家详细信息”的元素。从那里,您可以进行一些很好的DOM遍历,以到达所需的节点

$tds = $html->find('td');
$emails = array();
foreach( $tds as $td ){
    if($td->plaintext == "Showing Buyer Details"){
        $email_node = $td->parent()->next_sibling()->first_child()->first_child()->first_child()->last_child();
        array_push($emails, $email_node->plaintext);
    }
}

此时,您的$emails数组应该满是电子邮件地址。我选择了数组,因为从你的问题中不太清楚是否有这些表的倍数。无论如何,搜索所有的
元素并不漂亮,但我看不出它如何使用注释。

请向我们展示您迄今为止的尝试。我刚刚尝试使用SimpleHTML运行
$html->查找('comment')
,但没有找到我真正想要的。我正在学习正则表达式,请有人帮忙。电子邮件地址很简单,你可以用
/mailto\:(.+)将其取出“/
@castis是的,我知道我可以使用此正则表达式搜索电子邮件,但我想获得更多的电子邮件地址,我只想获得买家电子邮件地址。我知道这很复杂,但需要真正的帮助。我如何在
之间获取文本?是的,我已经尝试过了,但正如我所提到的,这个页面有不同的部分使用相同的表结构。所以,唯一的选择是使用注释获取数据,就像您可以通过任何文本处理在注释和之间获取文本一样。然后使用这个片段的解析器哇,你太棒了,让我快速地试试这段代码,电子邮件呢,我怎样才能得到它呢?在得到那个块之后,我试着准确地写find<代码>$html->find('table tbody tr[1]td table tbody tr td b')->innertext$tds = $html->find('td');
$emails = array();
foreach( $tds as $td ){
    if($td->plaintext == "Showing Buyer Details"){
        $email_node = $td->parent()->next_sibling()->first_child()->first_child()->first_child()->last_child();
        array_push($emails, $email_node->plaintext);
    }
}