0
<?php
function walkDOM($node)
{
    if (! isset($node->childNodes))
        return;

    for ($i = 0; $i < $node->childNodes->length; $i++) {

        $childNode = $node->childNodes->item($i);
        $childNodeName = $childNode->nodeName;

        echo $childNode->nodeName . " - " . $childNode->nodeType . 
             " - \"" . $childNode->nodeValue . "\"\n";
        walkDOM($childNode);
    }
}

function processHTML($s)
{
    $doc = new DOMDocument('1.0', 'UTF-8');
    $success = $doc->loadHTML($s);
    if (! $success) {
        echo "Load HTML failed.\n";
        exit(1);
    }
    echo "Loaded HTML: " . $doc->saveHTML() . "\n";
    walkDOM($doc);
}

$s = '<div>hello, <p>world<big>!</big></p></div>';
processHTML($s);
?>

出力:

Loaded HTML: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><div>hello, <p>world<big>!</big></p></div></body></html>

html - 10 - ""
html - 1 - "hello, world!"
body - 1 - "hello, world!"
div - 1 - "hello, world!"
#text - 3 - "hello, "
p - 1 - "world!"
#text - 3 - "world"
big - 1 - "!"
#text - 3 - "!"

nodeValue上記のコードと出力から、 anyのプロパティにアクセスするDOMNodeと、すべてのタグが削除された内部HTMLが取得されることがわかります。これを使用して、次のようにすべてのタグを除外できます。

$s = '<div>hello, <p>world<big>!</big></p></div>';
$doc = new DOMDocument('1.0', 'UTF-8');
$doc->loadHTML($s);
echo $doc->childNodes->item(1)->nodeValue . "\n";

出力:

hello, world!

しかし、私も使用してそうすることができますstrip_tags

$s = '<div>hello, <p>world<big>!</big></p></div>';
echo strip_tags($s) . "\n";

2つの質問があります:

  1. 将来、このプロパティの動作をnodeValue利用して、タグを削除したり、想像できる他の種類のことを実行したりできますか?隠された驚きはありますか?
  2. タグを削除するために使用することは、タグを削除するために使用することとどのようnodeValueに異なりstrip_tags()ますか?
4

1 に答える 1

0

タグを削除したいだけなら、複雑なのはなぜですか?私はそれがより速く、strip_tags()関数を使用する方が良いと思います。また、削除してはならないタグ​​を指定するために2番目のパラメーターを取ることができます。

于 2012-04-23T17:03:12.053 に答える