在php / regex中解析表内容并通过td获取结果

时间:2017-02-24 22:50:29

标签: php regex dom xpath html-parsing

我有一张这样的桌子,我花了一整天时间试图从中获取数据:

<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中的内容?

2 个答案:

答案 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。