我正在使用文本编辑器在我的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;
}
我在这里找到了这个解决方案。