PHP在表(文件)中找到特定的值?

时间:2013-10-13 18:35:19

标签: php

我有一个文件table.html,并希望得到这个值:$ age,$ height,$ weight

table.html:

<tr><td class="key">Age</td><td class="value">24</td></tr>
<tr><td class="key">Height</td><td class="value">169</td></tr>
<tr><td class="key">Weight</td><td class="value">51</td></tr>

到目前为止,我已经制作了这段代码:

$html = file_get_contents("table.html");

libxml_use_internal_errors( true);
$doc = new DOMDocument;
$doc->loadHTML( $html);
$xpath = new DOMXpath( $doc);

// A name attribute on a <td>
$age = $xpath->query( '//td[@class="key"]')->item( 0);

echo $age->textContent;

$ age的“ echo ”结果为年龄,但我希望它 24

如何以相同的代码获得高度和重量?

3 个答案:

答案 0 :(得分:2)

您想要的类名是value,而不是key,因此您需要相应地修改XPath表达式:

$result = $xpath->query( '//td[@class="value"]');

$age = $result->item(0)->textContent;
$height = $result->item(1)->textContent;
$weight = $result->item(2)->textContent;

请注意,我已删除了另外两个XPath调用。正如Jonathan在下面的评论中指出的那样,一次调用就足够了,其余项目可以从生成的NodeList中检索。

至于输出检索到的值,您只需使用echoisset()即可。这是为了确保只有在设置数量时才回显数量:

echo (isset($age)) ? "Age: $age\n" : '';
echo (isset($age)) ? "Height: $height\n" : '';
echo (isset($age)) ? "Weight: $weight\n" : '';

上面的代码应该产生:

Age: 24
Height: 169
Weight: 51

Demo!


<强>更新

正如您在评论中所指出的,如果其中一个<tr>块不存在,则会失败。在这种情况下,您只需使用foreach循环来显示项目:

$quantities = $xpath->query( '//td[@class="key"]');
$values = $xpath->query('//td[@class="value"]');

foreach ($values as $key => $value) {
    echo $quantities->item($key)->textContent .' = '. $value->textContent."\n";
}

即使没有一个(或多个)<tr>标签,也会返回正确的结果。它会打印出那里的任何值。

例如,如果缺少高度行,则输出:

Age = 24
Weight = 51

Demo!

答案 1 :(得分:0)

让你知道文件的定义结构,这样的东西会起作用;使用->nextSibling->item(i)

$html = file_get_contents("table.html");

libxml_use_internal_errors( true);
$doc = new DOMDocument;
$doc->loadHTML( $html);
$xpath = new DOMXpath( $doc);

// A name attribute on a <td>
$age     = $xpath->query( '//td[@class="key"]')->item( 0);
$height  = $xpath->query( '//td[@class="key"]')->item( 1);
$weight  = $xpath->query( '//td[@class="key"]')->item( 2);

echo "\nAge: "    . $age->nextSibling->textContent;
echo "\nHeight: " . $height->nextSibling->textContent;
echo "\nWeight: " . $weight->nextSibling->textContent;

输出结果为:

Age: 24
Height: 169
Weight: 51

<强> Demo

也适用于空白值。

修改;

另一种方法是通过文本内容获取元素。

$html = file_get_contents("table.html");

libxml_use_internal_errors( true);
$doc = new DOMDocument;
$doc->loadHTML( $html);
$xpath = new DOMXpath( $doc);

// A name attribute on a <td>
$age     = $xpath->query( '//td[text()="Age"]')->item( 0);
$height  = $xpath->query( '//td[text()="Height"]')->item( 0);
$weight  = $xpath->query( '//td[text()="Weight"]')->item( 0);

echo "\nAge: "    . $age->nextSibling->textContent;
echo "\nHeight: " . $height->nextSibling->textContent;
echo "\nWeight: " . $weight->nextSibling->textContent;

<强> Demo

答案 2 :(得分:0)

$result = array();
foreach (array('age', 'height', 'weight') as $key => $value) {
    $result[$value] = $xpath->query( '//td[@class="value"]')->item($key)->textContent;
}

print_r($result);