";阅读更多“;用于带有格式化内容的帖子的选项-PHP


"Read More" option for posts with formatted content - PHP

我正在使用文本编辑器在我的WEB上输入帖子(这篇)。文本格式很好(我有图像,文本有样式),所以我的数据库中的帖子以HTML格式存储。例如,这就是一篇带有图像和一些文本的帖子将如何存储在数据库中:

<p><img alt="image" src="./img/news-img.jpg" style="height1:311px; width1:1157px" /></p>
<p style="text-align: justify;"><span style="color:rgb(112, 112, 112); font-family:opensansregular; font-size:14px">
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</span></p>

当显示时,它会看起来像这样。我只使用PHP,没有任何框架。现在,我想在主页上为每个帖子只写几个字,并添加一个按钮"阅读更多",这将导致页面上的所有内容的帖子。我已经尝试过(但我预计它不会起作用)对文本进行子字符串处理。它不起作用,因为帖子被当作普通字符串(php看不到标签没有关闭),如果我指定只使用前200个字符,同时有<i>标签,如果关闭的</i>标签不在这200个字符中,我帖子下面的所有文本都是斜体。或者在另一种情况下,如果分割为200个字符,则不会显示图像,因为文本没有完全拍摄。

有没有一种方法可以让我以某种方式转换内容,当从数据库中提取前200个租船人(这个数字只是一个例子,不需要为所有帖子固定)时,所有标签都会同时关闭,该帖子下面的内容也会正常?

这很困难,因为缺少数据结构。移除标签是一种选择吗?你有没有可能添加一点结构?说一个额外的字段,人们会在其中存储一个标题,你可以用它作为你的锚。

也许两者兼而有之。你有第二个输入,你预先填充了你认为是一个好锚的内容,如果出现问题,他们可以改进它。

我使用以下函数解决了问题:

function closetags($html) {
    #put all opened tags into an array
    preg_match_all('#<([a-z]+)(?: .*)?(?<![/|/ ])>#iU', $html, $result);
    $openedtags = $result[1];   #put all closed tags into an array
    preg_match_all('#</([a-z]+)>#iU', $html, $result);
    $closedtags = $result[1];
    $len_opened = count($openedtags);
    # all tags are closed
    if (count($closedtags) == $len_opened) {
        return $html;
    }
    $openedtags = array_reverse($openedtags);
    # close tags
    for ($i=0; $i < $len_opened; $i++) {
        if (!in_array($openedtags[$i], $closedtags)){
            $html .= '</'.$openedtags[$i].'>';
        } else {
            unset($closedtags[array_search($openedtags[$i], $closedtags)]);    
        }
    }  
    return 
$html;
}

我在这里找到了这个解决方案。