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