PHP从描述中剥离图像

时间:2018-02-02 15:29:24

标签: php xml

我试图从下面的xml提取中删除图像,但到目前为止没有运气。 我使用了以下代码(PHP get img src from xml),但它没有给出结果。

$dom = new DOMDocument();
libxml_use_internal_errors(1);
$dom->loadXML( $xml );
$dom->formatOutput = True;
$xpath = new DOMXPath( $dom );

foreach( $xpath->query( 'channel/item/description' ) as $node )
{
    $html = new DOMDocument();
    $html->loadHTML( $node->nodeValue );
    $src = $html->getElementsByTagName( 'img' )->item(0)->getAttribute('src');
    echo $src.PHP_EOL ."<br/>";
}

希望有人可以指出我正确的方向或告诉我我做错了什么。

<item>
<title>
Menschenversuche mit Abgasen: „Ein vertretbares geringes Risiko“
</title>
<description>
<img width=190 height=107 border=0 title="Hier fanden die Versuche statt – ganz freiwillig: Uniklinik der RWTH Aachen" alt="Hier fanden die Versuche statt – ganz freiwillig: Uniklinik der RWTH Aachen" src=http://media0.faz.net/ppmedia/aktuell/wirtschaft/1493413458/1.5429400/article_teaser/hier-fanden-die-versuche-statt.jpg /><p>Blutabnahme, Lungenfunktionstest, dann in einer „Anlage“ Stickoxid einatmen. Ein Student, der an den viel diskutierten Menschenversuchen an der RWTH Aachen teilnahm, erzählte nun, wie es im Detail zuging – allerdings unter den Augen seiner Professoren.</p>
</description>
<link>
http://www.faz.net/aktuell/beruf-chance/campus/ein-student-und-seine-professoren-erzaehlen-von-den-menschenversuchen-mit-abgasen-15429186.html
</link>
<pubDate>Fri, 02 Feb 2018 13:44:11 +0100</pubDate>
<guid isPermaLink="true">http://www.faz.net/-gyq-96p8i</guid>
</item>

这是我目前丑陋的解决方法,我相信有一个更好的解决方案:

description2 = $xml->channel->item[$i]->description;
preg_match('/(<img[^>]+>)/i', $description2, $image4);
preg_match('/(src[^>]+>)/i', $image4[0], $image2);
$image2 = $image2[0];
$image2 = rtrim( $image2, " />");
$image2 = ltrim( $image2, "src=");

更新:这是我目前的版本:

我无法直接将RSS Feed加载到Dom中,此处可以看到正确方向的任何提示。

$feed = "http://www.faz.net/rss/aktuell/";
$xml = simplexml_load_file($feed);
$dom_xml = dom_import_simplexml($xml);
$dom = new DOMDocument();
libxml_use_internal_errors(1);
$dom->formatOutput = True;
$dom_xml = $dom->importNode($dom_xml, true);
$dom_xml = $dom->appendChild($dom_xml);

$xpath = new DOMXPath( $dom );

foreach( $xpath->query( 'channel/item/description' ) as $node )
{
    $html = new DOMDocument();
    $html->loadHTML( $node->nodeValue );
    $src = $html->getElementsByTagName( 'img' )->item(0)->getAttribute('src');
    echo $src.PHP_EOL ."<br/>";
}

1 个答案:

答案 0 :(得分:1)

这是xpath查询中的问题。如果在查询前加上两个斜杠(选择文档中与路径匹配的所有节点),您将得到预期的结果。

$xpath->query( '//channel/item/description' )

我使用该更改运行您的代码并且它有效。

编辑:使用以下cURL的完整示例:

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'www.faz.net/rss/aktuell/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$xml = curl_exec($ch);

if($xml===false)
{
    $curlErrorMsg = curl_error($ch);
    die('Unable to load feed: '.$curlErrorMsg);
}

curl_close($ch);

$dom = new DOMDocument();

$xmlLoaded = $dom->loadXML( $xml );

if(!$xmlLoaded)
{
    die('Invalid XML');
}

$xpath = new DOMXPath( $dom );

foreach( $xpath->query( '//channel/item/description' ) as $node )
{
    $html = new DOMDocument();
    $html->loadHTML( $node->nodeValue );
    $src = $html->getElementsByTagName( 'img' )->item(0)->getAttribute('src');
    echo $src.PHP_EOL ."<br/>";
}

有关详细信息,请参阅PHP cURL docs