获取字符串的前n个字符

时间:2010-07-01 21:28:20

标签: php string

如何在PHP中获取字符串的前n个字符?将字符串修剪为特定数量的字符的最快方法是什么,如果需要,可以附加“...”?

20 个答案:

答案 0 :(得分:539)

//The simple version for 10 Characters from the beginning of the string
$string = substr($string,0,10).'...';

更新

根据检查长度的建议(以及确保修剪和未修剪琴弦的长度类似):

$string = (strlen($string) > 13) ? substr($string,0,10).'...' : $string;

所以你会得到一个最多13个字符的字符串; 13个(或更少)正常字符或10个字符后跟'...'

更新2:

或作为功能:

function truncate($string, $length, $dots = "...") {
    return (strlen($string) > $length) ? substr($string, 0, $length - strlen($dots)) . $dots : $string;
}

更新3:

我写这个答案已经有一段时间了,我实际上不再使用这个代码了。我更喜欢这个函数,它可以防止使用wordwrap函数打破单词中间的字符串:

function truncate($string,$length=100,$append="…") {
  $string = trim($string);

  if(strlen($string) > $length) {
    $string = wordwrap($string, $length);
    $string = explode("\n", $string, 2);
    $string = $string[0] . $append;
  }

  return $string;
}

答案 1 :(得分:105)

自4.0.6版以来,此功能已内置于PHP中。 See the docs

echo mb_strimwidth('Hello World', 0, 10, '...');

// outputs Hello W...

请注意,trimmarker(上面的省略号)包含在截断长度中。

答案 2 :(得分:15)

如果您需要控制字符串字符集,则多字节扩展可以派上用场。

$charset = 'UTF-8';
$length = 10;
$string = 'Hai to yoo! I like yoo soo!';
if(mb_strlen($string, $charset) > $length) {
  $string = mb_substr($string, 0, $length - 3, $charset) . '...';
}

答案 3 :(得分:9)

有时,你需要将字符串限制为最后一个完整的单词,即:你不希望最后一个单词被打破,而是用第二个单词停止。

例如: 我们需要将“This is my String”限制为6个字符,但不是“This i ...”我们希望它是“This ...”,即我们将跳过最后一个字中的破碎字母。

p pw,我很难解释,这是代码。

class Fun {

    public function limit_text($text, $len) {
        if (strlen($text) < $len) {
            return $text;
        }
        $text_words = explode(' ', $text);
        $out = null;


        foreach ($text_words as $word) {
            if ((strlen($word) > $len) && $out == null) {

                return substr($word, 0, $len) . "...";
            }
            if ((strlen($out) + strlen($word)) > $len) {
                return $out . "...";
            }
            $out.=" " . $word;
        }
        return $out;
    }

}

答案 4 :(得分:8)

codeigniter框架包含一个帮助器,称为“文本助手”。以下是适用于codeigniter的用户指南的一些文档:http://codeigniter.com/user_guide/helpers/text_helper.html (只需阅读word_limiter和character_limiter部分)。 以下是与您的问题相关的两个函数:

if ( ! function_exists('word_limiter'))
{
    function word_limiter($str, $limit = 100, $end_char = '&#8230;')
    {
        if (trim($str) == '')
        {
            return $str;
        }

        preg_match('/^\s*+(?:\S++\s*+){1,'.(int) $limit.'}/', $str, $matches);

        if (strlen($str) == strlen($matches[0]))
        {
            $end_char = '';
        }

        return rtrim($matches[0]).$end_char;
    }
}

if ( ! function_exists('character_limiter'))
{
    function character_limiter($str, $n = 500, $end_char = '&#8230;')
    {
        if (strlen($str) < $n)
        {
            return $str;
        }

        $str = preg_replace("/\s+/", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str));

        if (strlen($str) <= $n)
        {
            return $str;
        }

        $out = "";
        foreach (explode(' ', trim($str)) as $val)
        {
            $out .= $val.' ';

            if (strlen($out) >= $n)
            {
                $out = trim($out);
                return (strlen($out) == strlen($str)) ? $out : $out.$end_char;
            }       
        }
    }
}

答案 5 :(得分:7)

如果你想小心不要分割单词,你可以执行以下操作

function ellipse($str,$n_chars,$crop_str=' [...]')
{
    $buff=strip_tags($str);
    if(strlen($buff) > $n_chars)
    {
        $cut_index=strpos($buff,' ',$n_chars);
        $buff=substr($buff,0,($cut_index===false? $n_chars: $cut_index+1)).$crop_str;
    }
    return $buff;
}

如果$ str比$ n_chars短,则返回它。

如果$ str等于$ n_chars,则返回原样。

如果$ str超过$ n_chars,那么它会查找下一个要剪切的空格或(如果没有更多空格直到结尾)$ str会被粗略地削减而不是$ n_chars。

注意:请注意,如果是HTML,此方法将删除所有代码。

答案 6 :(得分:4)

使用子字符串

http://php.net/manual/en/function.substr.php

$foo = substr("abcde",0, 3) . "...";

答案 7 :(得分:3)

if(strlen($text) > 10)
     $text = substr($text,0,10) . "...";

答案 8 :(得分:1)

我为这个用途开发了一个函数

 function str_short($string,$limit)
        {
            $len=strlen($string);
            if($len>$limit)
            {
             $to_sub=$len-$limit;
             $crop_temp=substr($string,0,-$to_sub);
             return $crop_len=$crop_temp."...";
            }
            else
            {
                return $string;
            }
        }

你只需用字符串和限制来调用函数 例如:str_short("hahahahahah",5);
它将剪切你的字符串并在末尾添加“...”  :)

答案 9 :(得分:1)

这就是我做的事情

    function cutat($num, $tt){
        if (mb_strlen($tt)>$num){
            $tt=mb_substr($tt,0,$num-2).'...';
        }
        return $tt;
    }

其中$ num表示字符数,$ tt表示操作字符串。

答案 10 :(得分:1)

我使用的功能:

function cutAfter($string, $len = 30, $append = '...') {
        return (strlen($string) > $len) ? 
          substr($string, 0, $len - strlen($append)) . $append : 
          $string;
}

in action

答案 11 :(得分:1)

要在函数内创建(重复使用)和动态有限长度,请使用:

function string_length_cutoff($string, $limit, $subtext = '...')
{
    return (strlen($string) > $limit) ? substr($string, 0, ($limit-strlen(subtext))).$subtext : $string;
}

// example usage:
echo string_length_cutoff('Michelle Lee Hammontree-Garcia', 26);

// or (for custom substitution text
echo string_length_cutoff('Michelle Lee Hammontree-Garcia', 26, '..');

答案 12 :(得分:1)

我不确定这是否是最快的解决方案,但看起来它是最短的解决方案:

$result = current(explode("\n", wordwrap($str, $width, "...\n")));

P.S。请参阅此处的一些示例https://stackoverflow.com/a/17852480/131337

答案 13 :(得分:1)

最好抽象你的代码是这样的(注意限制是可选的,默认为10):

print limit($string);


function limit($var, $limit=10)
{
    if ( strlen($var) > $limit )
    {
        return substr($string, 0, $limit) . '...';
    }
    else
    {
        return $var;
    }
}

答案 14 :(得分:0)

substr()最好,你还要先查看字符串的长度

$str = 'someLongString';
$max = 7;

if(strlen($str) > $max) {
   $str = substr($str, 0, $max) . '...';
}

wordwrap不会修剪掉字符串,只是将其拆分......

答案 15 :(得分:0)

$ width = 10;

$a = preg_replace ("~^(.{{$width}})(.+)~", '\\1…', $a);

或使用wordwrap

$a = preg_replace ("~^(.{1,${width}}\b)(.+)~", '\\1…', $a);

答案 16 :(得分:0)

这个解决方案不会削减单词,它会在第一个空格后添加三个点。 我编辑了@ Raccoon29解决方案,并用 mb _ 函数替换了所有函数,这样就适用于所有语言,例如阿拉伯语

function cut_string($str, $n_chars, $crop_str = '...') {
    $buff = strip_tags($str);
    if (mb_strlen($buff) > $n_chars) {
        $cut_index = mb_strpos($buff, ' ', $n_chars);
        $buff = mb_substr($buff, 0, ($cut_index === false ? $n_chars : $cut_index + 1), "UTF-8") . $crop_str;
    }
    return $buff;
}

答案 17 :(得分:0)

$yourString = "bla blaaa bla blllla bla bla";
$out = "";
if(strlen($yourString) > 22) {
    while(strlen($yourString) > 22) {
        $pos = strrpos($yourString, " ");
        if($pos !== false && $pos <= 22) {
            $out = substr($yourString,0,$pos);
            break;
        } else {
            $yourString = substr($yourString,0,$pos);
            continue;
        }
    }
} else {
    $out = $yourString;
}
echo "Output String: ".$out;

答案 18 :(得分:0)

如果对截断的字符串长度没有严格要求,则可以使用它来截断并防止截断最后一个单词:

$text = "Knowledge is a natural right of every human being of which no one
has the right to deprive him or her under any pretext, except in a case where a
person does something which deprives him or her of that right. It is mere
stupidity to leave its benefits to certain individuals and teams who monopolize
these while the masses provide the facilities and pay the expenses for the
establishment of public sports.";

// we don't want new lines in our preview
$text_only_spaces = preg_replace('/\s+/', ' ', $text);

// truncates the text
$text_truncated = mb_substr($text_only_spaces, 0, mb_strpos($text_only_spaces, " ", 50));

// prevents last word truncation
$preview = trim(mb_substr($text_truncated, 0, mb_strrpos($text_truncated, " ")));

在这种情况下,$preview将是"Knowledge is a natural right of every human being"

实时代码示例: http://sandbox.onlinephpfunctions.com/code/25484a8b687d1f5ad93f62082b6379662a6b4713

答案 19 :(得分:0)

此功能可以在不中断单词的情况下完成工作

    function str_trim($str,$char_no){
        if(strlen($str)<=$char_no)
            return $str;
        else{
            $all_words=explode(" ",$str);
            $out_str='';
            foreach ($all_words as $word) {
                $temp_str=($out_str=='')?$word:$out_str.' '.$word;
                if(strlen($temp_str)>$char_no-3)//-3 for 3 dots
                    return $out_str."...";
                $out_str=$temp_str;
            }
        }
    }