Php 在html结束标记后剪切文本

Php 在html结束标记后剪切文本,php,Php,我在我的网站上有一个评论系统,一些用户写了很长的评论,超过500个字符,我需要在200个字符后删除它,并添加“查看更多”选项。问题是用户可以使用测试> /代码>标签,在某些情况下,200个字符的限制会在中间剪掉标签,比如“代码> T 或 < P>我认为应该已经在因特网上的某个地方,但是找不到它。基本上你需要做的是计算打开的标签,然后如果打开的标签比关闭的多,那么它是打开的,不能剪切。是一种可以让你朝着正确的方向前进的东西,让你知道如何轻松地计算打开和关闭的标签数量。好吧,我想我做到了。如果有人有

我在我的网站上有一个评论系统,一些用户写了很长的评论,超过500个字符,我需要在200个字符后删除它,并添加“查看更多”选项。问题是用户可以使用<代码>测试> /代码>标签,在某些情况下,200个字符的限制会在中间剪掉标签,比如“代码> T 或<代码> < P>我认为应该已经在因特网上的某个地方,但是找不到它。基本上你需要做的是计算打开的标签,然后如果打开的标签比关闭的多,那么它是打开的,不能剪切。是一种可以让你朝着正确的方向前进的东西,让你知道如何轻松地计算打开和关闭的标签数量。

好吧,我想我做到了。如果有人有任何建议,请随意修改此答案或评论

function cut_text($string, $length = 350, $append = "&hellip;")
{

    $string = trim($string);
    $string_length = strlen($string);
    $original_string = $string;
    if ($string_length > $length) {
        $remaining_chars = $string_length - $length;
        if (strpos($string, '<') !== false && strpos($string, '>') !== false) {
            $string = wordwrap($string, $length);
            $string = explode("\n", $string, 2);
            $string = $string[0] . $append;
            $fillimi = substr_count($string, '<');
            $fundi = substr_count($string, '>');
            if ($fillimi == $fundi) {
                $string = $string;
            } else {
                $i = 1;
                while ($i <= $remaining_chars) {
                    $string = wordwrap($original_string, $length + $i);
                    $string = explode("\n", $string, 2);
                    $new_remaining_chars = $string_length - ($length + $i);
                    if ($new_remaining_chars > 0) {
                        $string = $string[0] . $append;
                    } else {
                        $string = $string[0];
                    }
                    $fillimi = substr_count($string, '<');
                    $fundi = substr_count($string, '>');
                    if ($fillimi == $fundi) {
                        $string = $string;
                        break;
                    }
                    $i++;
                }
            }
        } else {
            $string = trim($string);

            $string = wordwrap($string, $length);
            $string = explode("\n", $string, 2);
            $string = $string[0] . $append;

        }
    }
    return $string;
}
函数剪切文本($string,$length=350,$append=“&hellip;”)
{
$string=修剪($string);
$string_length=strlen($string);
$original_string=$string;
如果($string\u length>$length){
$剩余字符=$字符串长度-$长度;
if(strpos($string,,)!==false){
$string=wordwrap($string,$length);
$string=explode(“\n”,$string,2);
$string=$string[0]。$append;
$fillimi=substr_计数($string,”);
如果($fillimi==$fundi){
$string=$string;
}否则{
$i=1;
而(i)(0元){
$string=$string[0]。$append;
}否则{
$string=$string[0];
}
$fillimi=substr_计数($string,”);
如果($fillimi==$fundi){
$string=$string;
打破
}
$i++;
}
}
}否则{
$string=修剪($string);
$string=wordwrap($string,$length);
$string=explode(“\n”,$string,2);
$string=$string[0]。$append;
}
}
返回$string;
}

在函数中编写一个单独的函数tagCatcher(传递整个文本),快速检查可使用的一组标记。如果使用数据库跟踪标记,则只需执行查询即可。只是一个建议,不是答案。在函数中,您可以数到200个字符,然后对“”进行一些检查,然后进行扩展,直到找到“/>”,假设您可以在该函数中编写它。我在写点东西。你知道上面的作品吗?我不是按照你说的去做,我给你的评论投了一票,因为我想你会做某事。。。我正试图用另一种方法来解决这个问题,这是一个复杂的问题,用原始代码很难回答。由于HTML不是一种常规语言,我们在如何理解这一点上受到限制。这是我的思考过程。首先,我们用]*>(.*)找到字符串中的所有打开和关闭项,然后保留该计数。然后,我们使用一个类似的正则表达式来查找有多少个打开的标记。然后我们检查它是否与完成的ed标记的数量匹配。如果我们不将1与计数进行匹配,直到找到匹配为止,它是递归的,因此您可以在得到答案之前调用函数本身。我唯一的问题是,它计算<和>的数量,而不是它是否是标记。有人可能会在评论中使用<。是的,但这仍然不是问题。我已经测试过了,它工作得很好。这是答案,但可以定义得更多,以解释过程中出现的问题。干得好。我觉得这应该是一个评论,这是一个书面的解决方案,所以我把这一点重新定为零。@KirsKringle:谢谢你。我确实同意,我应该为此付出更多。
function cut_text($string, $length = 350, $append = "&hellip;")
{

    $string = trim($string);
    $string_length = strlen($string);
    $original_string = $string;
    if ($string_length > $length) {
        $remaining_chars = $string_length - $length;
        if (strpos($string, '<') !== false && strpos($string, '>') !== false) {
            $string = wordwrap($string, $length);
            $string = explode("\n", $string, 2);
            $string = $string[0] . $append;
            $fillimi = substr_count($string, '<');
            $fundi = substr_count($string, '>');
            if ($fillimi == $fundi) {
                $string = $string;
            } else {
                $i = 1;
                while ($i <= $remaining_chars) {
                    $string = wordwrap($original_string, $length + $i);
                    $string = explode("\n", $string, 2);
                    $new_remaining_chars = $string_length - ($length + $i);
                    if ($new_remaining_chars > 0) {
                        $string = $string[0] . $append;
                    } else {
                        $string = $string[0];
                    }
                    $fillimi = substr_count($string, '<');
                    $fundi = substr_count($string, '>');
                    if ($fillimi == $fundi) {
                        $string = $string;
                        break;
                    }
                    $i++;
                }
            }
        } else {
            $string = trim($string);

            $string = wordwrap($string, $length);
            $string = explode("\n", $string, 2);
            $string = $string[0] . $append;

        }
    }
    return $string;
}