【问题标题】:PHP DOM - Remove all elements EXCEPT...?PHP DOM - 删除所有元素,除了......?
【发布时间】:2012-05-28 17:31:06
【问题描述】:

我正在尝试使用 PHP 来编辑 DOM 文档树。但是,我被困住了。加载 HTML 后,我想删除除我指定的少数几个元素之外的每个元素。 (例如<p><b>)我该怎么做?有没有可能?

以下是我当前的代码:

<?php
$url = 'http://en.wikipedia.org/w/index.php?title=Elephant&action=render';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');

$html = '<html>' . curl_exec($curl) . '</html>';
echo $html;

$document = new DOMDocument;
$document->loadHTML($html);

$allowed_elements = array(
    'a',
    'b',
    'i',
    'p',
);

$parent = $document->getElementsByTagName('html')->item(0);

foreach ($parent->getElementsByTagName('*') as $element)
{
    $node = strtolower((string)$element->nodeName);
    if (!in_array($node, $allowed_elements))
    {
        $element->parentNode->removeChild($element);
    }
}

echo $document->saveHTML();

curl_close($curl);
?>

我的修补表明可以循环遍历 DOM 树,所以我假设我可以循环遍历它。但是,我的代码仍然无法正常工作!我正在尝试最终获得纯文本的 Wikipedia 文章——如果有人知道我不必自己编写的替代工具,那将是一个可以接受的答案。

谢谢!! :)

【问题讨论】:

    标签: php html xml dom wikipedia


    【解决方案1】:

    试试这个:

    <?php
    $url = 'http://en.wikipedia.org/w/index.php?title=Elephant&action=render';
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
    
    $html = '<html>' . curl_exec($curl) . '</html>';
    curl_close($curl);
    
    $document = new DOMDocument('1.0');
    $document->loadHTML($html);
    
    $allowed_elements = array('a','b','i','p');
    $elems = array();
    
    $parent = $document->getElementsByTagName('html')->item(0);
    
    foreach ($parent->getElementsByTagName('*') as $element)
    {
        $node = (string)$element->nodeName;
        if(strtolower($node) == 'body'){
            continue;
        }
    
        $elems[] = $node;
    }
    
    $elems = array_values( array_unique( $elems ) );
    $elems = array_diff( $elems, $allowed_elements );
    $elems = array_values( array_unique( $elems ) );
    sort($elems);
    
    foreach( $elems as $elem ) {
        $parent1 = $parent->getElementsByTagName($elem);
        $length = $parent->getElementsByTagName($elem)->length;
    
        for($i=0;$i<$length;$i++) {
            $el = $parent1->item(0); // 0 is the index because after each `removeChild`, the next element shifts 1 position back.
            if( $el ) {
                $el->parentNode->removeChild($el);
            }
        }
    }
    
    echo $document->saveHTML();
    ?>
    

    $elementsToKeep - 数组包含不被删除的项目列表。

    希望这会有所帮助。

    【讨论】:

    • 它似乎不起作用。我已经更新了我必须向您展示我所在位置的示例代码。另外,请注意我不希望它搜索&lt;body&gt; 标签——我正在处理 HTML sn-ps,而不是完整的文档。
    • 我根据您的回复更改了代码。看看,让我知道。谢谢。
    • 像魅力一样工作。非常感谢您的帮助!
    • 不过,看着这个,我真的很困惑。你能解释一下它是如何工作的吗?
    • 很高兴它对您有所帮助。我在这里做了一个描述-pastebin.com/RuRWagEn。如果您遇到任何问题,请告诉我:)。
    猜你喜欢
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 2022-12-31
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    相关资源
    最近更新 更多