【问题标题】:How to get correctly content and avoid breaking html tags using strip_tags with substr?如何使用带有 substr 的 strip_tags 获取正确的内容并避免破坏 html 标签?
【发布时间】:2011-11-23 01:20:31
【问题描述】:

在我的页面中,我有一些来自 RSS 提要的帖子预览。每个帖子预览显示大约 300 个字符。当用户点击展开按钮时,#post-preview 将替换为#post。 #post 显示帖子的其余部分。

这一切都很好,但#post 的格式不好,不可读。所以我想到了允许<br><b><p>标签,这样就可以被阅读了。因为我不想让用户分心,所以我希望在 300 个字符之后允许标记。

使用下面的方法,可以打破$start结束和$rest开始的一些标签。这意味着没有好的可读输出。

$start = strip_tags(substr($entry->description, 0, 300));
$rest = strip_tags(substr($entry->description, 300), '<b><p><br>');
$start . $rest;

我的问题是如何在 300 字符之前保持 $start$rest 相同(无标签),然后 $rest 将显示格式化的帖子?有没有其他方法可以做到这一点?

这是一个 RSS 提要结构的示例(来自查看页面源)。

<item><guid isPermaLink="false"></guid><pubDate></pubDate><atom:updated></atom:updated><category domain=""></category><title></title><description></description><link></link><author></author></item>

我正在寻找一种不会影响性能的方法。

【问题讨论】:

  • 也许您可以遍历所有字符并计算字符 。如果 ,您只需添加更多字符,直到 $start 达到所需的 > 计数。
  • 您可以简单地去除所有标签并将前 300 个原始文本字符显示为摘录。毕竟,一篇文章的前 300 个字符完全有可能只有 html 标签,从而使摘录无用。
  • @MarcB 你能给我看个样品吗?我没有完全理解重点......
  • $start = substr(strip_tags($entry-&gt;description), 0, 300)。不要试图弄清楚如何在其中保留 html 标签,因为这是一场失败的游戏。通过消除摘录的标签来绕过问题,并为“阅读更多”链接保留完整的文档。单击阅读更多链接时隐藏无标签摘录,仅显示原始完整文档。
  • @MarcB 但这不是我发布的吗?

标签: php javascript jquery xml dom


【解决方案1】:

类似:

$start = substr($entry->description, 0, 300);
if(($pos = stripos($start, "<")) !== false) {
    $start = strip_tags(substr($start, 0, $pos));
    $rest = substr($entry->description, $pos);
}
else {
    $start = strip_tags($start);
    $rest = substr($entry->description, 300);
}

好吧,这只是一个概念。获取前 300 个字符并检查损坏的标签。如果在它之前断掉并从此时获得$rest。如果没有损坏,请脱掉并休息。至少有 1 个问题:

  • 你现在永远不会知道 $start 的长度(在 strip_tags 之后可能什么都没有了),可以使用带有长度检查的循环,但是 eeee...效率

编辑 好的,明白了:

$start = "";
$chars = 400;
while(strlen($start) < 300) { 
    $start = strip_tags(substr($rss, 0, $chars));
    $chars += 50;
}
$pos = stripos($rss, substr($start, strlen($start) - 50));
$rest = substr($rss, $pos+50);

好的,有点讨厌,在某些情况下它会失败(可能有可重复的文本:D),在 Ideone 上测试过

【讨论】:

  • 因为 $rest 是 rest,所以要回显整个只是 echo $start.$rest;
  • 我可以通过 $rest 来回显整篇文章。 $start 没有回应。
  • 也许这就是我提到的问题...你能给一些示例数据吗?
  • 我现在在移动设备上,但是我的内容是rss feed,你可以查看任何rss的页面源,寻找描述标签...z
猜你喜欢
  • 2020-02-29
  • 2011-01-24
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
  • 1970-01-01
  • 2018-08-28
  • 1970-01-01
相关资源
最近更新 更多