正在解析 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"
我有一个像这样的 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"