4

HTML文字列にノードを挿入しようとしています。私の目標は、各 h2 タグの前に要素を挿入することです。

そのために、私は使用しています:

$htmlString = "<h2>some html</h2>";

$DOM = new DOMDocument();
$DOM->loadHTML($htmlString);

$itemTitles = $DOM->getElementsByTagName('h2');

for($i = 0; $i < $itemTitles->length; $i ++)
{
    $helpNavigatorContents[] = $itemTitles->item($i)->nodeValue;
    $textBefore = new DOMNode(
        '<a name="'.$itemTitles->item($i)->nodeValue.'"></a>'
    );
    $itemTitles->item($i)->parentNode->insertBefore(
        $textBefore, 
        $itemTitles->item($i)
    );
}

$htmlString = $DOM->saveHTML($DOM);

そして、ここで私はに問題があり$textBeforeます。$textBeforeをとして宣言するとDOMText、ノードの前にテキストを挿入できますが、 でこれを試すとDOMNode、次のエラーが発生します ( Demo ):

警告: DOMNode::insertBefore(): DOMNode を取得できませんでした

4

1 に答える 1

9

コードに意味はありません。DOMNodeコンストラクタはありません。作成することはまったく想定されていません。DOMDocumentドキュメントに関連付けるために、特定のノード タイプを作成する必要があります。

すべての H2 要素の先頭にアンカーを追加する場合、次のようにします。

libxml_use_internal_errors(true);
$DOM = new DOMDocument();
$DOM->loadHTML($htmlString);
$DOM->preserveWhiteSpace = false;

foreach ($DOM->getElementsByTagName('h2') as $h2) {
    $a = $DOM->createElement('a');
    $a->setAttribute('name', $h2->nodeValue);
    $h2->parentNode->insertBefore($a, $h2);
}
$DOM->formatOutput = true;
echo $DOM->saveHTML();

デモhttp://codepad.org/N0dPcLwT

H2 要素を A 要素にラップするには、単純に同じ操作を行って追加します

$a->appendChild($h2);

デモhttp://codepad.org/w7Hi0Bmz

于 2012-09-28T14:24:19.597 に答える