正则表达式从有些复杂的HTML表中解析值

时间:2014-03-06 11:28:05

标签: regex

我有这个包含很多表格的网页。我无法更改该页面,但需要一种方法来处理该页面上不同应用程序中的数据,因此我需要能够解析它并提取一些数据。我对正则表达式很糟糕所以非常感谢你对此有所帮助。我很可能在PHP(Laravel)应用程序中使用正则表达式,如果这与语法相关。

我需要解析的网页包含很多这些(除其他外):

<!-- Post number: 10000 -->
<!-- 127.0.0.1  127.0.0.1 -->
<table class="message" cellspacing="0" cellpadding="0" border="0">
    <tr>
        <td>
            <table cellspacing="0" cellpadding="0" border="0">
                <tr>
                    <td class="tableheader2" nowrap>
                        <B>Name: </B> Firstname Lastname
                    </td>
                    <td class="tableheader2" nowrap>
                        <a href="url.html?param=10000" target="_blank">
                            <img src="image.png" alt="Alt message" border="0">
                        </a>
                        &nbsp;
                        <a href="url2.html?param2=20000">
                            <img src="image2.png" alt="Alt message" border="0">
                        </a>
                        &nbsp;
                    </td>
                    <td class="tableheader2" width="100%">
                        &nbsp;
                    </td>
                </tr>
                <tr>
                    <TD class="tableheader2" WIDTH=520 colspan="3">
                        <b>
                            Sent:  
                        </b>
                        2014-01-01 11:00:00<BR>
                    </td>
                </tr>
            </table>
        </td>
    </tr>
    <tr>
        <td class="tableheader2">
            <table class="tableheader2" CELLSPACING=0 CELLPADDING=0 BORDER=0>
                <tr>
                    <td>
                        &nbsp;
                    </td>
                    <td>
                        Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quos, amet neque non voluptate facilis natus ullam impedit veritatis libero maiores.
                    </td>
                    <td>
                        &nbsp;
                    </td>
                </tr>
            </table>
        </td>
    </tr>
</table>
<hr align="left">

这只是很长一段时间中的众多此类帖子中的一个。为了便于阅读,我还编辑了一些(缩进)。

我需要的是能够解析整个页面并获取所有这些元素(我将使用他们的示例abow中的值,但它当然可以是任何东西):

  • 10000(来自邮政编号评论)
  • 名字姓氏
  • 2014-01-01 11:00:00
  • Lorem ipsum dolor坐下来,精神恍惚。 Quos,amet neque non voluptate facilis natus ullam impedit veritatis libero maiores。

对此有任何帮助将非常感激。我本来可以提供示例代码,但是我自己的徒劳尝试都没有接近,所以这可能只会产生相反的效果。

1 个答案:

答案 0 :(得分:0)

这种东西总是有一些猜测工作,但DOMDocument肯定有帮助:

$d = new DOMDocument;
$d->loadHTML($html);

$x = new DOMXPath($d);

foreach ($x->query('//table[@class="message"]') as $message) {
    // find preceding comment
    $start = $message->previousSibling;
    while ($start && !preg_match('/Post number:\s*(\d+)/', $start->nodeValue, $match)) {
        $start = $start->previousSibling;
    }
    if ($start === null) {
        continue; // comment not found
    }
    $post = $match[1];
    foreach ($x->query('tr[1]//td[@class="tableheader2"]', $message) as $hdr) {
        if (preg_match('/Name:\s*(.*)/', $hdr->nodeValue, $match)) {
            $name = rtrim($match[1]); // found name
        } elseif (preg_match('/Sent:\s*(.*)/', $hdr->nodeValue, $match)) {
            $sent = rtrim($match[1]); // found sent
        }
    }
    // find description from the next row
    $desc = trim($x->query('tr[2]//table[@class="tableheader2"]/tr/td[2]', $message)->item(0)->nodeValue);
    echo "Post: $post\nName: $name\nSent: $sent\nDesc: $desc\n";
}