PHP DOM-删除除…之外的所有元素。。。?
我正在尝试使用PHP编辑DOM文档树。然而,我被卡住了。加载HTML后,我想删除除我指定的部分元素之外的所有元素。(例如,PHP DOM-删除除…之外的所有元素。。。?,php,html,xml,dom,wikipedia,Php,Html,Xml,Dom,Wikipedia,我正在尝试使用PHP编辑DOM文档树。然而,我被卡住了。加载HTML后,我想删除除我指定的部分元素之外的所有元素。(例如,和)我该怎么做?有可能吗 以下是我目前的代码: <?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
和
)我该怎么做?有可能吗
以下是我目前的代码:
<?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树,所以我假设我可以循环通过它。但是,我的代码仍然不起作用!我试图最终获得维基百科的纯文本文章——如果有人知道一个我不必自己编写的替代工具,那将是一个可以接受的答案
谢谢!!:) 试试这个:
<?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-包含不被删除项目列表的数组
希望这有帮助。试试这个:
<?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-包含不被删除项目列表的数组
希望这有帮助。它似乎不起作用。我已经更新了示例代码,我必须向您展示我所处的位置。另外,请注意,我不希望它搜索
标记--我处理的是HTML片段,而不是完整的文档。我根据您的回答更改了代码。看一看,让我知道。谢谢,很有魅力。非常感谢你的帮助!但是,仔细看,我真的很困惑。你能解释一下它是如何工作的吗?很高兴它能帮助你。我在这里做了一个描述-。如果遇到任何问题,请告诉我:)。它似乎不起作用。我已经更新了示例代码,我必须向您展示我所处的位置。另外,请注意,我不希望它搜索
标记--我处理的是HTML片段,而不是完整的文档。我根据您的回答更改了代码。看一看,让我知道。谢谢,很有魅力。非常感谢你的帮助!但是,仔细看,我真的很困惑。你能解释一下它是如何工作的吗?很高兴它能帮助你。我在这里做了一个描述-。如果遇到任何问题,请告诉我:)。