限制文本并确保没有标记打开

时间:2012-06-08 18:55:33

标签: php truncate

所以我有一个文章列表,我有一个页面,一次显示4篇文章,然后将文章的描述缩短为1000个字符,并允许用户阅读更多&#34;,我的问题是在每个帖子中可能有标签IE:<i><b> <img> <center>等,截断文本时我可以看到是否有任何打开的标签div或在被调用的文本中?

以下是它现在的样子

$sum = strip_tags($article, '<a><i><b><u><center><br><img><a><span><iframe>');
    if (strlen($sum) > 1000) {
        $sumCut = substr($sum, 0, 1000);
        $sum = substr($sumCut, 0, strrpos($sumCut, ' ')).'... <div class="right"><a href="article-' .$record[nid]. '">Read More</a></div>'; 
}

 echo $sum;

例如

如果我有......

Quisque imperdiet imperdiet fladilla。 Quisque坐在一个nibh odio。 Fusce坐在aa massa massa mi faucibus viverra。

代码为<i>Quisque imperdiet imperdiet fringilla. Quisque sit amet nibh odio. Fusce sit amet massa vitae mi faucibus viverra.</i>

但是如果我要将截断数设置为10,那么它会使该标记保持打开状态,因此所有后缀都将以斜体显​​示

2 个答案:

答案 0 :(得分:2)

如此动态让我接近,但使用strpos()是关键,我将其添加到我的代码if ((strpos($sum, '<i>')) && (!strpos($sum, '</i>'))) { echo "</i>"; }中,并为我允许的每个标记添加一个类似的,接下来要做的是弄清楚如何为了确保帖子末尾附近没有图片或iframe,我会编辑这个来解释我是如何做到的,但现在这里是我的代码......

$sum = strip_tags($article, '<a><i><b><u><center><br><img><a><span><iframe>');
if (strlen($sum) > 1000) {
    $sumCut = substr($sum, 0, 1000);
    $sum = substr($sumCut, 0, strrpos($sumCut, ' '));
    $cut = 1; 
}else{
    $cut = 0; }

echo $sum;
if ((strpos($sum, '<i>')) && (!strpos($sum, '</i>'))) { echo "</i>"; }

if ($cut==1) { echo '... <div class="right"><a href="article-' .$record[nid]. '">Read More</a></div>'; }

修改

好吧,我找到了一个更好的解决方案,而不是确保在帖子的末尾没有图像,我只是制作了div overflow: hidden;,其中它会为图像调整大小

修改

我还遇到了打破<br>代码中间位置的问题,它让我<br临时解决方案似乎是在这些内容之后添加另一个<br> case留下了错误的代码<br<br>,但至少一切正常并且不可见,但如果有人有更可行的解决方案请告诉我

我希望这会有所帮助

答案 1 :(得分:1)

使用strpos(),搜索前X个字符中的开放标记(其中X是截断数字。)如果为true,则添加到字符串中。

基本上,(伪代码)

if(first10chars.contains[use strpos here] "<i>" and !.contains "</i>") {
$endstr .= "</i>";
}

并为其他人做同样的事情。一个非常糟糕的方式,但它会工作