我有这个包含很多表格的网页。我无法更改该页面,但需要一种方法来处理该页面上不同应用程序中的数据,因此我需要能够解析它并提取一些数据。我对正则表达式很糟糕所以非常感谢你对此有所帮助。我很可能在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>
<a href="url2.html?param2=20000">
<img src="image2.png" alt="Alt message" border="0">
</a>
</td>
<td class="tableheader2" width="100%">
</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>
</td>
<td>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quos, amet neque non voluptate facilis natus ullam impedit veritatis libero maiores.
</td>
<td>
</td>
</tr>
</table>
</td>
</tr>
</table>
<hr align="left">
这只是很长一段时间中的众多此类帖子中的一个。为了便于阅读,我还编辑了一些(缩进)。
我需要的是能够解析整个页面并获取所有这些元素(我将使用他们的示例abow中的值,但它当然可以是任何东西):
对此有任何帮助将非常感激。我本来可以提供示例代码,但是我自己的徒劳尝试都没有接近,所以这可能只会产生相反的效果。
答案 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";
}