0

dom ドキュメントを使用して特定の HTML の塊を抽出しようとしています。

私のコードは次のとおりです。

    $domd = new DOMDocument('1.0', 'utf-8');
    $domd->loadHTML($string);
    $this->hook = 'content';
    if($this->hook !== '') {
        $main = $domd->getElementById($this->hook);
        $newstr = "";
        foreach($main->childNodes as $node) {
            $newstr .= $domd->saveXML($node, LIBXML_NOEMPTYTAG);
        }
        $domd->loadHTML($newstr);
    }
    //MORE PARSING USING THE DOMD OBJECT

それはうまく機能しますが、 foreach は非常に遅いので、これを行うためのよりインテリジェントな方法があるかどうか疑問に思っていました. 編集を続けられるように、HTML を $domd に再読み込みしています。心の奥底では、保存された $newstr をオブジェクトに再ロードするのではなく、フラグメントを保存するべきだと感じています。

これをよりエレガントまたは高速にすることはできますか?

ありがとう!

4

1 に答える 1

1

$domd既存のドキュメントを変更して、そのコンテンツ ノードから取得している子ノードに完全に置き換えたいと想定しています。

更新:loadHTMLを使用してリロードしていたので、おそらく作成したhtml/bodyノードを保持したいと思ったことに気付きました。以下のコードは、空bodyにしてそこにフラグメントを追加するように調整されています。

$domd = new DOMDocument('1.0', 'utf-8');
$domd->loadHTML($string);
$this->hook = 'content';
if($this->hook !== '') {
    $main = $domd->getElementById($this->hook);
    $fragment = $domd->createDocumentFragment();
    while($main->hasChildNodes()) {
        $fragment->appendChild($main->firstChild);
    }
    $body = $domd->getElementsByTagName("body")->item(0);
    while($body->hasChildNodes()) {
        $body->removeChild($body->firstChild);
    }
    $body->appendChild($fragment);
}
//MORE PARSING USING THE DOMD OBJECT
于 2012-05-25T01:43:25.913 に答える