我有一张这样的桌子,我花了一整天时间试图从中获取数据:
<table class="table table-condensed">
<tr>
<td>Monthely rent</td>
<td><strong>Fr. 1'950. </strong></td>
</tr>
<tr>
<td>Rooms(s)</td>
<td><strong>3</strong></td>
</tr>
<tr>
<td>Surface</td>
<td><strong>93m2</strong></td>
</tr>
<tr>
<td>Date of Contract</td>
<td><strong>01.04.17</strong></td>
</tr>
</table>
正如您所看到的那样,数据组织得很好,我试图得到这个结果:
monthly rent => Fr. 1'950.
Rooms(s) => 3
Surface => 93m2
Date of Contract => 01.04.17
我将表包含在变量$table
中并尝试使用DOM
$dom = new DOMDocument();
$dom->loadHTML($table);
$dom = new \DomXPath($dom);
$result = $dom->query('//table/tr');
return $result;
但无济于事,有没有更简单的方法来获取php / regex中的内容?
答案 0 :(得分:2)
您使用DOM和Xpath处于正确的轨道上。不要使用正则表达式来解析HTML / XML。 RegEx用于匹配文本,通常用作解析器的一部分。但格式的解析器知道它的功能 - RegEx没有。
你应该让变量名更清洁一点。不要在同一上下文中为同一个变量分配不同的类型。它只显示变量名可能是通用的。
DOMXpath::query()
允许您使用Xpath表达式,但只允许使用返回节点列表的表达式。 DOMXpath::evaluate()
也允许您获取标量值。
因此,您可以获取tr
元素,迭代它们并使用其他表达式来使用tr
元素作为上下文来获取这两个值。
$document = new \DOMDocument();
$document->loadHTML($table);
$xpath = new \DOMXPath($document);
foreach ($xpath->evaluate('//table/tr') as $tr) {
var_dump(
$xpath->evaluate('string(td[1])', $tr),
$xpath->evaluate('string(td[2]/strong)', $tr)
);
}
输出:
string(13) "Monthely rent"
string(11) "Fr. 1'950. "
string(8) "Rooms(s)"
string(1) "3"
string(7) "Surface"
string(4) "93m2"
string(16) "Date of Contract"
string(8) "01.04.17"
答案 1 :(得分:1)
试试这个:
$dom = new DOMDocument();
$dom->loadHTML($table);
$dom = new \DomXPath($dom);
$result = $dom->query('//table/tr/td/strong');
foreach($result as $item) {
echo $item->nodeValue . "\n";
}
那将打印元素。但是,您可能希望以一种不必处理html标记(如<strong>
)的方式设置数据。您可能想要使用xml甚至是json。