2013-10-13 2 views
2

У меня есть файл table.html и хотел бы получить эти значения: $ возраста, $ высоты, $ весаPHP найти определенные значения внутри таблицы (файла)?

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; 

«эхо» результат $ возраст Возраст, но я хочу, чтобы это было

Как получить результаты по высоте и весу в том же коде?

+1

ли '@ класс = "значение"' не работает? –

+0

класс = "значение" работает. Но в некоторых случаях, если значение высоты пустое, вес будет отображаться как высота. – Cyborg

+0

@Cyborg: Что вы хотите сделать, если один из элементов (например, Height) отсутствует в таблице? Вы хотите отобразить остальную часть количества? Или что-то вроде 'Height: undefined'? –

ответ

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. Как отмечает Джонатан в комментариях ниже, одного вызова достаточно, а остальные элементы можно получить из полученного NodeList.

Что касается вывода полученных значений, вы можете просто использовать echo, с isset(). Это, чтобы убедиться, что вы только эхо величины, если они установлены:

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!


UPDATE

Как вы отметили в комментариях, это будет если один из блоков <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!

+0

Что делать, если значение высоты ПУСТОЙ? – Cyborg

+0

@Cyborg: Если он пуст, значение не будет отображаться. Если вы хотите убедиться, что он не пуст, вы можете сделать 'if (isset ($ height)) {// echo value}' и тому подобное. –

+0

Вы не должны запрашивать три раза; только один раз должно быть хорошо. Затем вы можете захватить элементы из полученного NodeList. – Sampson

0

Обеспечивая вы знаете definate структуру файла, что-то, как это будет работать; используя ->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

Также работает с пустыми значениями.

EDIT;

Другой способ сделать это - получить элемент по его текстовому контенту.

$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

+0

Что вы подразумеваете под * Также работает с пустыми значениями. *? –

+0

ОП опубликовал комментарий к вашему ответу: «Что делать, если значение высоты ПУСТО?». Он просто утверждает, что если значение пустое, оно будет продолжать работать. –

+0

@Jack Возможно ли заменить ** // td [@ class = "key"] ** на ** Возраст **? Потому что я могу избежать пункта (0), пункта (1) и пункта (2), и я буду на 100% уверен, что это значение: – Cyborg

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

print_r($result); 
Смежные вопросы