基于HTML评论的高级正则表达式帮助

时间:2015-06-12 20:59:26

标签: 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; 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>

我希望使用正则表达式或其他好东西获取完整的姓名和电子邮件地址。这对我来说真的很先进,所以我很感激任何真正的帮助。非常感谢。

2 个答案:

答案 0 :(得分:0)

您可以尝试按正则表达式选择表格

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

然后,如果你使用SimpleHTMLDomParser,写(如果我不放任何级别)

$html = str_get_html($str);
$name = $html->find("table", 1)->find("tr", 0)->find("td", 0)->find("b", 0)->innertext;
$address = $html->find("table", 1)->find("tr", 1)->find("td", 0)->innertext;
if (!$name || !$address) die("nof found");
echo $name . " " . $address;

答案 1 :(得分:0)

看起来你需要获得正确的表格,然后是那里的电子邮件地址。不会骗你,使用类和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数组应该包含电子邮件地址。我使用了数组,因为如果有多个这些表,你的问题并不是很清楚。无论如何,搜索所有<td>元素并不是很好,但我不知道它是如何使用这些注释的。