2011-01-13 29 views
7

IDタグによってはリンクを削除しようとしていますが、リンクの内容はそのまま残しておきます。たとえば、私は、私は以下を使用してみましたが PHP Dom要素の内容を削除する

Some text goes here 

Some text goes <a href="http://www.domain.tdl/" id="remove">here</a> 

をオンにしたいです。

$dom = new DOMDocument; 
$dom->loadHtml(mb_convert_encoding($html, 'HTML-ENTITIES', "UTF-8")); 
$xp = new DOMXPath($dom); 

foreach($xp->query('//a[contains(@id="remove")]') as $oldNode) { 
$revised = strip_tags($oldNode); 
} 

$revised = mb_substr($dom->saveXML($xp->query('//body')->item(0)), 6, -7, "UTF-8"); 
echo $revised; 

は大体hereから運ばれたが、それだけで$htmlの同じ内容をバック吐きます。

どのように私はこれを達成するだろうか?

+0

あなたはここで文書を変更していないので、同じ内容が出るのです。あなたが提供した例では、DOMオブジェクト上で 'replaceChild'を呼び出していて、後で' saveXML'の出力で後で上書きする変数を作成しています。 –

+0

良い質問、+1。目的のノードを正確に選択する単一のXPath式ソリューションの答えを見てください。 :) –

答えて

12

そのために私の機能です:

function DOMRemove(DOMNode $from) { 
    $sibling = $from->firstChild; 
    do { 
     $next = $sibling->nextSibling; 
     $from->parentNode->insertBefore($sibling, $from); 
    } while ($sibling = $next); 
    $from->parentNode->removeChild($from);  
} 

ので、この:

$dom->loadHTML('Hello <a href="foo"><span>World</span></a>'); 
$a = $dom->getElementsByTagName('a')->item(0); // get first 
DOMRemove($a); 

あなたを与える必要があります。

Hello <span>World</span> 

を特定のIDを持つノードを取得するには、XPathを使用します。

$xpath = new DOMXpath($dom); 
$node = $xpath->query('//a[@id="something"]')->item(0); // get first 
DOMRemove($node); 
+0

私はこのコードを別の投稿で見ましたが、a)エラー「致命的なエラー:非オブジェクト上のメンバー関数insertBefore()を呼び出します。」およびb)これをどのように特定のIDを持つ要素のみを削除しますか? – Jack

+0

@Jack:申し訳ありませんが、関数引数は '$ from'であり、' $ node'ではありませんでした。一定。それを指摘してくれてありがとう。また、特定の 'id'を持つノードを取得するための例を追加しました。 – netcoder

+0

2つの質問;改訂されたデータはどのように出力されますか?あなたが特定のIDのために与えた例を使用すると、以前と同じエラーが発生します。 – Jack

1

使用

//a[@id='remove']/node() 
| 
//*[a[@id='remove']]/node()[not(self::a[@id=''remove])] 

これは値"remove"を持つ任意のa持つ属性id"remove"

の値を持つ別の a持つ属性 idそのものではありません。この aのすべての前後の兄弟のすべての子を選択し、
2

@ netcoderの答えに似ていますが、別のループ構造とDOMElementメソッドを使用するアプローチです。

$html = '<html><body>This <a href="http://www.domain.tdl/" id="remove">link</a> was removed.</body></html>'; 
$dom = new DOMDocument(); 
$dom->loadHTML($html); 
$xpath = new DOMXPath($dom); 
foreach ($xpath->query('//a[@id="remove"]') as $link) { 
    // Move all link tag content to its parent node just before it. 
    while($link->hasChildNodes()) { 
    $child = $link->removeChild($link->firstChild); 
    $link->parentNode->insertBefore($child, $link); 
    } 
    // Remove the link tag. 
    $link->parentNode->removeChild($link); 
} 
$html = $dom->saveXML(); 
+0

'$ child = $ link-> removeChild($ link-> firstChild);'単に '$ child = $ link-> firstChild;'と書くことができますか? – myol

関連する問題