3

用語集のツールチップの実装を簡素化するために、dom オブジェクトを使用しようとしています。私がする必要があるのは、段落内のテキスト要素を置き換えることですが、段落に埋め込まれている可能性のあるアンカータグでは置き換えません。

$html = '<p>Replace this tag not this <a href="#">tag</a></p>';
$document = new DOMDocument();
$document->loadHTML($html);
$document->preserveWhiteSpace = false;
$document->validateOnParse = true;

$nodes = $document->getElementByTagName("p");
foreach ($nodes as $node) {
  $node->nodeValue = str_replace("tag","element",$node->nodeValue);
}
echo $document->saveHTML();

私は得る:

'...<p>Replace this element not this element</p>...'

私が欲しい:

'...<p>Replace this element not this <a href="#">tag</a></p>...'

親ノードのテキストのみが変更され、子ノード (タグ) が変更されないように実装するにはどうすればよいですか?

4

1 に答える 1

4

これを試して:

$html = '<p>Replace this tag not this <a href="#">tag</a></p>';
$document = new DOMDocument();
$document->loadHTML($html);
$document->preserveWhiteSpace = false;
$document->validateOnParse = true;

$nodes = $document->getElementsByTagName("p");

foreach ($nodes as $node) {
    while( $node->hasChildNodes() ) {
        $node = $node->childNodes->item(0);
    }
    $node->nodeValue = str_replace("tag","element",$node->nodeValue);
}
echo $document->saveHTML();

お役に立てれば。

UPDATE 以下のコメントで@paulの質問に答えるには、作成できます

$html = '<p>Replace this tag not this <a href="#">tag</a></p>';
$document = new DOMDocument();
$document->loadHTML($html);
$document->preserveWhiteSpace = false;
$document->validateOnParse = true;

$nodes = $document->getElementsByTagName("p");

//create the element which should replace the text in the original string
$elem = $document->createElement( 'dfn', 'tag' );
$attr = $document->createAttribute('title');
$attr->value = 'element';
$elem->appendChild( $attr );

foreach ($nodes as $node) {
    while( $node->hasChildNodes() ) {
        $node = $node->childNodes->item(0);
    }
    //dump the new string here, which replaces the source string
    $node->nodeValue = str_replace("tag",$document->saveHTML($elem),$node->nodeValue);
}
echo $document->saveHTML();
于 2012-12-18T07:08:13.843 に答える