2012-05-13 2 views
1

Можно ли получить и затем эхо-контент между тегами, используя только PHP?Эхо-контент между тегами?

Например. Если это следующая HTML:

<td class="header subject">Text</td> 

Как вы можете получить Text внутри тегов, а затем echo это?

Я думал, что это будет работать:

<? 
preg_match("'<td class=\"header subject\">(.*?)</td>'si", $source, $match); 
if($match) echo "result=".$match[1]; 
?> 

Но переменная $source должна быть вся страница.

Примечание: существует только один экземпляр класса header subject, поэтому не должно быть проблем с несколькими тегами.

+0

Ваш код * работает * - в чем проблема? – Ansari

+5

regexes on html ВСЕГДА будем ненадежны. HTML не является обычным языком. Вместо этого используйте [DOM] (http://php.net/dom). –

ответ

1

Предполагая, что ваша проблема в том, что вы не знаете, как интерпретировать эту страницу, вы можете попробовать это:

<?php 
$lines = file("/path/to/file.html"); 
foreach($lines as $i => $line) 
{ 
    if (preg_match("'<td class=\"header subject\">(.*?)</td>'si", $line, $match)) 
    { 
     echo "result=". $match[$i]; 
    } 
} 
?> 
2

Вы должны анализировать текст, используя DOMDocument класс, и захватить textContent из элемент.

$html = '<td class="header subject">Text</td>'; 

$dom = new DOMDocument(); 
$dom->loadHTML($html); 

// Text 
echo $dom->getElementsByTagName("td")->item(0)->textContent; 

Или, если вам нужно перебрать много td элементов и показывают только текст тех, которые имеют значение класса "header subject", вы можете сделать следующее:

$tds = $dom->getElementsByTagName("td"); 

for ($i = 0; $i < $tds->length; $i++) { 
    $currentTD = $tds->item($i); 
    $classAttr = $currentTD->attributes->getNamedItem("class"); 
    if ($classAttr && $classAttr->nodeValue === "header subject") { 
    echo $currentTD->textContent; 
    } 
} 

Демо: http://codepad.org/o1xqrnRS