修剪一个字符串并添加到它的末尾

时间:2014-03-31 13:45:41

标签: php string str-replace substr

我想要做的是基本上缩短一段文字,如果文字太长,最后加上“......”。然而(这里它变得毛茸茸)我只想应用它,如果字符串的最后一个字符是空格。如果它不是空格,那么我想通过字符串(Backwords)直到我找到一个空格,然后当找到空格时我将添加“...”。

对此的推理是我不希望在未完成时将“...”添加到单词中,例如“wor ...”我宁愿它是“单词......”。

这是我到目前为止所尝试的内容(注意:$ row_object_title只是一个来自数据库的字符串,因此可以安全地假设它只是一个随机文本):

if (strlen($row_object_title) > 50){
    // check for spaces
        $short = substr($row_object_title,50);

        $chr = substr($short,-1);
        $ascii = ord($chr);
        if ($ascii == "32"){
            $row_object_title .= "...";
        }else{  
            $x = 49;
            while($ascii !== "32"){
                $chr = substr($short,$x);
                $ascii = ord($chr);
                if ($ascii == "32"){
                    // we got a space!
                    $row_object_title .= "...";
                }
                $x = $x - 1;                        
            }

        }
}

感谢您的帮助

更新:

if (strlen($row_object_title) > 50){
    // check for spaces
        $short = substr($row_object_title,50);

        $chr = substr($short,-1);
        $ascii = ord($chr);
        if ($ascii == "32"){
            //$trim = "...";
            //$final = str_replace($short,$trim,$row_object_title);
            $row_object_title .= "...";
        }else{  
            $x = 49;
            while($ascii != "32"){
                $chr = substr($short,$x,1);
                $ascii = ord($chr);
                if ($ascii == "32"){
                    // we got a space!
                    $row_object_title .= "...";
                }
                $x = $x - 1;                        
            }

        }
}

第二次更新: 每个人都在发布他们的脚本版本(非常感谢),但你们可能会尝试修复我的而不是发布其他方式吗?

4 个答案:

答案 0 :(得分:1)

ord()返回一个整数,但您使用$ascii检查!==的值,并将其与字符串进行比较。与!=相反,!==仅在操作数类型匹配时才为真。

此外,要从字符串中提取单个字符,请指定子字符串的长度:

$chr = substr($short,$x,1);

您也可以直接索引字符串:$chr = $short{$x}

修改:发现了两个漏洞:

第二行应该是:

$short = substr($row_object_title, 0, 50);

(你错过了长度参数之前的偏移量。)

此外,您将'...'附加到原始字符串,而不是缩短版本。以下是(希望)更正的脚本的完整版本。

if (strlen($row_object_title) > 50){
    // check for spaces
        $short = substr($row_object_title,50);

        $chr = substr($short,-1);
        $ascii = ord($chr);
        if ($ascii == 32){
            $row_object_title = $short . "...";
        }else{  
            $x = 49;
            while($ascii != 32){
                $chr = substr($short,$x,1);
                $ascii = ord($chr);
                if ($ascii == 32){
                    // we got a space!
                    $row_object_title = substr($short, 0, $x) . "...";
                }
                $x = $x - 1;                        
            }

        }
}

答案 1 :(得分:0)

我使用以下功能,无法记住我找到它的位置。清除文本中的HTML,并将字符串限制为$limit个字符,而不会破坏文字。

function show_chopped_text($str, $limit)
{
    $regex = "/<\/?\w+((\s+\w+(\s*=\s*(?:\".*?\"|'.*?'|[^'\">\s]+))?)+\s*|\s*)\/?>/i";
    $strip_html = preg_replace($regex,'',$str);

    $rough_short_par = substr($strip_html, 0, $limit); 
    $last_space_pos = strrpos($rough_short_par, " ");
    $clean_short_par = substr($rough_short_par, 0, $last_space_pos);
    $clean_sentence = $clean_short_par . "..."; 
    return $clean_sentence;
}

答案 2 :(得分:0)

如果我理解你的问题,这应该可以解决问题:

// if string does *not* end with one or more whitespace characters
if(!preg_match('/\s+$/',$string)) {
    // replace everything after last group of one or more whitespaces with '...'
    $string = preg_replace('/(.*)\s+.*/','\1...',$string);
}

答案 3 :(得分:0)

$text = "This should just fit in! But if we make it longer, it won't ";
if (strlen($text) > 50) {
    $text = substr($text, 0, 50);
    for ($i = strlen($text) - 1; $i > 0; $i--) {
        if ($text[$i] === ' ' || $text[$i] === ',' || $text[$i] === '.' || $text[$i] === '!' || $text[$i] === '?') {
            $text = substr($text, 0, $i) . '... <b>Read More</b>';
            break;
        }
    }
}

我的工作(应该添加RegEx,但我对那些......并不是那么好)。