如何在PHP中保留XML中的HTML?

时间:2016-06-17 23:51:15

标签: php xml

我正在尝试使用PHP创建自己的新闻页面。但是,我遇到了一些障碍。我想要将每个帖子分开,一次只加载5个帖子,以保留HTML。我得到了前两个,但第三个正在成为一个问题。

我尽我所能。我并不确切知道每个函数是如何相互交互的,所以在尝试添加新内容时我总是会破坏某些东西。我尝试在这里使用saveHTML(),但无论我把它放在哪里,它都不会做任何事情或破坏某些东西。

我想要的只是帖子的内容保留HTML,有些帖子有无序列表,有些帖子有链接。

顺便说一句,这是代码:

<?php
    $rss = new DOMDocument();
    $rss->load('http://screenbones.com/news.xml');
    $feed = array();
    foreach ($rss->getElementsByTagName('item') as $node) {
        $item = array ( 
            'title' => $node->getElementsByTagName('title')->item(0)->nodeValue,
            'desc' => $node->getElementsByTagName('description')->item(0)->nodeValue,
            'link' => $node->getElementsByTagName('link')->item(0)->nodeValue,
            'date' => $node->getElementsByTagName('pubDate')->item(0)->nodeValue,
            );
        array_push($feed, $item);
    }
    $limit = 5;
    for($x=0;$x<$limit;$x++) {
        $title = str_replace(' & ', ' &amp; ', $feed[$x]['title']);
        $link = $feed[$x]['link'];
        $description = $feed[$x]['desc'];
        $date = date('l F d, Y', strtotime($feed[$x]['date']));

        echo '<article>';
        echo '<p><strong><a href="'.$link.'" title="'.$title.'">'.$title.'</a></strong><br />';
        echo '<small><em>Posted on '.$date.'</em></small></p>';
        echo $description;
        echo '</article>';
    }
?>

2 个答案:

答案 0 :(得分:0)

您正在阅读nodeValue <description>的{​​{1}}属性,这只是文字内容。请改为使用DOMDocument::saveHTML()方法替代节点。

编辑:信用转到Musa。我原来的答案是错的。 &lt; article&gt;标签让我觉得OP出于某种原因正在生成XML ..

答案 1 :(得分:0)

通常,RSS feed使用带有序列化XML的description元素中的CDATA部分/文本字段。在您的情况下,使用XHTML,但没有定义命名空间。

$document = new DOMDocument();
$document->load('http://screenbones.com/news.xml');
$xpath = new DOMXpath($document);

foreach ($xpath->evaluate('//item[position() <= 5]') as $item) {
  $title = $xpath->evaluate('string(title)', $item);
  $link = $xpath->evaluate('string(link)', $item);
  $date = date('l F d, Y', strtotime($xpath->evaluate('string(date)', $item)));

  if ($xpath->evaluate('count(description/*) > 0', $item)) {
    $descriptionFragment = '';
    foreach ($xpath->evaluate('description/node()', $item) as $content) {
      $descriptionFragment .= $document->saveHtml($content);
    }
  } else {
    $descriptionFragment = $xpath->evaluate('string(description)', $item);
  }

  printf (
    '<article>
       <p><strong><a href="%1$s" title="%2$s">%2$s</a></strong><br />
       <small><em>Posted on %2$s</em></small></p>
       %3$s
     </article>',
    htmlspecialchars($link),
    htmlspecialchars($title),
    htmlspecialchars($date),
    $descriptionFragment 
  );
} 

该示例使用Xpath表达式,它允许您从DOM获取节点和值。

第一个表达式//item[position() <= 5]获取前五个item元素。对于另一个表达式,$item节点用作上下文,因此它们是相对于它的。

string(title)这样的表达式按名称获取元素节点,并将第一个找到的节点强制转换为字符串。如果未找到任何节点,则返回空字符串。

count(description/*) > 0检查描述中是否有元素节点(不仅是text / cdata节点)。如果是这种情况,它会迭代描述中的所有子节点并将它们序列化为HTML。否则,它将单个文本节点读为序列化HTML。

htmlspecialchars()用于转义HTML输出等&之类的字符。小心$descriptionFragment。它是直接来自外部源的HTML。您可能希望在使用它之前进行清理。