3

simple_html_dom を使用して、HTML のスニペットからすべてのスパンを削除しようとしています。次を使用しています。

$body = "<span class='outer' style='background:red'>x<span class='mid' style='background:purple'>y<span class='inner' style='background:orange'>z</span></span></span>";
$HTML = new simple_html_dom;
$HTML->load($body);   
$spans = $HTML->find('span');
foreach($spans as $span_tag) {
    echo "working on ". $span_tag->class . " ... ";
    echo "setting " . $span_tag->outertext . " equal to " . $span_tag->innertext . "<br/>\n";
    $span_tag->outertext = (string)$span_tag->innertext;
}
$text =  $HTML->save();
$HTML->clear();
unset($HTML);
echo "<br/>The Cleaned TEXT is: $text<br/>";

そして、これが私のブラウザの結果です:

http://www.pixeloution.com/RAC/clean.gif

では、なぜ最も外側のスパンだけが削除されてしまうのでしょうか?

編集

実際、これを行う簡単な方法があれば、私はゲームです. オブジェクトは、タグを削除することですが、他のタグを含めてタグ内に何かを保持するか、または $obj->paintext を使用します

編集#2

わかりました...どうやらうまくいきましたが、奇妙なことに、以前に誰かがこれに遭遇した場合、実際に問題を理解したいと思っています。最も外側のスパンのみを削除していることを知っていたので、次のようにしました。

function cleanSpansRecursive(&$body) {

    $HTML = new simple_html_dom;
    $HTML->load($body); 
    $spans = $HTML->find('span');
    foreach($spans as $span_tag) {
        $span_tag->outertext = (string)$span_tag->innertext;
    }

    $body =  (string)$HTML;
    if($HTML->find('span')) {
        $HTML->clear();
        unset($HTML);
        cleanSpansRecursive($body);
    } else {
        $HTML->clear();
        unset($HTML);
    }  
}

そしてそれはうまくいくようです。

4

1 に答える 1

1

マシンまたは開発サーバーにインストールしていないsimple_html_domためテストできませんが、見た目から、設定により外側のスパン内に$span_tag->outertext新しいオブジェクトが作成されるため、古い参照は. 参照がそのまま保持されるため、最も内側から外側に移動すると修正されるはずです。span$HTML

編集: 2 番目の編集では、置換を行うたびに新しく作成されたスパンが見つかります。これが機能する理由です。

于 2010-01-31T05:48:01.860 に答える