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

Parsing table content in php/regex and getting result by td

我有一个像这样的 table,我花了一整天试图从以下位置获取数据:

<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 包含在变量 $table 中并尝试使用 DOM

$dom = new DOMDocument(); 
$dom->loadHTML($table);
$dom = new \DomXPath($dom);
$result = $dom->query('//table/tr');
return $result; 

但是没有用,有没有更简单的方法获取php/regex中的内容?

试试这个:

$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.

您在 DOM 和 Xpath 方面走在正确的轨道上。不要使用正则表达式来解析 HTML/XML。 RegEx 用于匹配文本,通常用作解析器的一部分。但是格式的解析器知道它的特性——正则表达式不知道。

你应该让你的变量名更干净一点。不要在同一上下文中将不同类型分配给同一变量。它只表明变量名可能是通用的。

DOMXpath::query() 允许您使用 Xpath 表达式,但只表示 return 表达式的一个节点列表。 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"