我正在尝试使用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(' & ', ' & ', $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>';
}
?>
答案 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。您可能希望在使用它之前进行清理。