19

私がやろうとしているのは、PHPシステム内にHTMLファイルを含めることです(問題ありません)が、さまざまな理由から、そのHTMLファイルも単独で使用できる必要があるため、Doctype、htmlを削除する方法を知る必要があります。 、可能であれば、PHPのコンテキストでのheadタグとbodyタグにはインクルードが含まれます。

私はPHP(doh!)が特に得意ではないので、phpマニュアルやWebで検索しても、これを理解することはできません。ヘルプまたは読書のヒント、あるいはその両方が非常に高く評価されていることを意味します。

4

8 に答える 8

23

このsubstr()メソッドは飲み込むには多すぎるように思われたため、DOMパーサーメソッドを次に示します。

$d = new DOMDocument;
$mock = new DOMDocument;
$d->loadHTML(file_get_contents('/path/to/my.html'));
$body = $d->getElementsByTagName('body')->item(0);
foreach ($body->childNodes as $child){
    $mock->appendChild($mock->importNode($child, true));
}

echo $mock->saveHTML();

http://codepad.org/MQVQ3XQP

誰もがその「他のもの」を見たいと思っています、改訂を見てください。

于 2012-06-29T01:07:18.563 に答える
14
$site = file_get_contents("http://www.google.com/");

preg_match("/<body[^>]*>(.*?)<\/body>/is", $site, $matches);

echo($matches[1]);
于 2018-01-08T18:45:50.120 に答える
6

不要なものを取り除くのではなく、DOMDocumentを使用して必要なものを保持します(PHP> = 5.3.6)

$d = new DOMDocument;
$d->loadHTMLFile($fileLocation);
$body = $d->getElementsByTagName('body')->item(0);
// perform innerhtml on $body by enumerating child nodes 
// and saving them individually
foreach ($body->childNodes as $childNode) {
  echo $d->saveHTML($childNode);
}
于 2012-06-29T01:21:26.893 に答える
3

無効なXHTML構造(この場合、DOMDocumentのロードがクラッシュする)を修正し、本文のみを抽出できるPHPtidy拡張機能を使用することをお勧めします。

$tidy = new tidy();
$htmlBody = $tidy->repairString($html, array(
    'output-xhtml' => true,
    'show-body-only' => true,
), 'utf8');

次に、抽出された本文をDOMDocumentにロードします。

$xml = new DOMDocument();
$xml->loadHTML($htmlBody);

次に、XMLノードなどをトラバース、抽出、移動し、保存します。

$output = $xml->saveXML();
于 2014-09-04T13:49:20.917 に答える
2

DOMパーサーを使用します。これはテストされていませんが、あなたが望むことをするべきです

$domDoc = new DOMDocument();
$domDoc.loadHTMLFile('/path/to/file');
$body = $domDoc->GetElementsByTagName('body')->item(0);
foreach ($body->childNodes as $child){
    echo $child->C14N(); //Note this cannonicalizes the representation of the node, but that's not necessarily a bad thing
}

正規化を避けたい場合は、このバージョンを使用できます(@Jared Farrishに感謝)

于 2012-06-29T01:23:39.893 に答える
0

DOMDocumentのインスタンスが1つだけで、ループがないソリューション

$d = new DOMDocument();
$d->loadHTML(file_get_contents('/path/to/my.html'));
$body = $d->getElementsByTagName('body')->item(0);
echo $d->saveHTML($body);
于 2019-07-17T09:43:52.990 に答える
0

miken32 が言ったように:

ねえ、9歳の質問に答えてみませんか?PHPバージョン5.4(この質問が行われてから3年後にリリースされました)は、optionsパラメーターをに 追加しましたDomDocument::loadHTML()。それを使用すると、これを行うことができます:

$dom = new DomDocument();
$dom->loadHTML($string, LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED);

// do stuff

echo $dom->saveHTML();

2つの定数を渡しLIBXML_HTML_NODEFDTDます。ドキュメントタイプ定義を追加しないことを示し、およびなどLIBXML_HTML_NOIMPLIEDの暗黙の要素を追加しないことを示します。<html><body>

于 2021-07-02T05:24:57.973 に答える
-1

これは解決策かもしれません。私はそれを試しました、そしてそれはうまくいきます。

function parseHTML(string) {
      var   parser = new DOMParser
     , result = parser.parseFromString(string, "text/html");
      return result.firstChild.lastChild.firstChild;
    }

于 2016-03-14T10:27:07.087 に答える