2012-05-13 8 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クラスのインスタンスは1つのみであるため、複数のタグに問題はありません。

+0

をあなたのコードは*動作します - 何が問題なのですか? – Ansari

+5

htmlのregexesは常に信頼できません。 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

関連する問題