获取字符串的前n个字符


Answers:


577
//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;
}

11
也许最好用省略号(…)而不是3点(...)代替
Keet 2013年

3
我喜欢这个,但是我对其进行了更改,并使用以下命令删除了空格:$ string = substr(trim($ string),0,10).'...'; 这样,您会得到类似“我喜欢...”而不是“我喜欢...”的信息。
Kenton de Jong 2013年

28
“hellip” -我花了一段时间来了解我们不是在谈论撒旦的IP地址
卢卡斯·贝尔纳多·索萨

2
Update 3最有用。
milkovsky

如果返回的字符串的长度有固定上限,则更新3的第5行不应该$string = wordwrap($string, $length - sizeof($append)); 吗?
Michael Crenshaw'17

114

自版本4.0.6起,此功能已内置到PHP中。请参阅文档

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

// outputs Hello W...

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


4
为我完美地工作。最佳答案没有用,我很高兴没有用,因为一直滚动并找到了这个宝石。
爱德华多

谢谢,我一直使用这种更长久的方法!
2014年

1
丹,您可能想更详细地说明最佳答案中哪一部分不适合您。函数truncate()对我来说非常理想,并且该答案比bruchowski答案的优势在于它会在单词边界处中断;假设您关心这种事情。
pdwalker 2014年

2
接得好!许多经验丰富的PHP开发人员都不知道此功能:)
jroi_web

1
最高的答案(现在)(stackoverflow.com/a/3161830/236306)什么都没有做(好像我根本没有使用过fn一样)。不知道为什么。但是,这个答案似乎很完美,并且带来了工作的额外好处。
艾伦(Alan)

15

如果需要控制字符串字符集,则可以使用Multibyte扩展名。

$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) . '...';
}

此代码将三个点添加到字符串?我的代码中有一个链接标签<a>,当我链接它时,它将与三个点链接在一起,这三个点将成为一个不同的值。
鲁2011年

9

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

例如:我们需要将“这是我的字符串”限制为6个字符,但我们希望将其改为“这...”,而不是“这是我...”,即我们将跳过最后一个单词中的破损字母。

,不好解释,这是代码。

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;
    }

}

9

如果您想节省时间不要分割单词,可以执行以下操作

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,此方法将删除所有标记。


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;
            }       
        }
    }
}


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

从@Brendon Bullen以上.. $ string =(strlen($ string)> 13)吗?substr($ string,0,10).'...':$ string; 不错!
MarcoZen


1

这就是我所做的

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

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


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;
            }
        }

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


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, '..');

1

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

print limit($string);


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

1
那将不起作用,因为trim()已经存在。
戈登

可以解释为什么这种方法是最好的,而不仅仅是断言是什么?
罗伯特2010年

1
@Robert很简单,抽象意味着您不必一遍又一遍地重新输入代码。最重要的是,如果您确实找到了一种更好的方法来执行此操作,或者想要更复杂的操作,则只需更改此1函数而不是50条代码。
特拉维斯

2
为什么函数是大写的?
卡洛

修复:$ var的substr,而不是$ string。测试反对$limit + 3,这样你就不会修剪字符串刚刚超过限制。根据您的应用程序(例如,HTML输出),请考虑使用一个实体&hellip;(在样式上更令人愉悦)。如前所述,在附加省略号之前,请剪除(缩短的)字符串末尾的所有非字母。最后,请注意是否处于多字节(例如UTF-8)环境中-不能使用strlen()和substr()。
Phil Perry 2014年


0

substr()最好,您还需要先检查字符串的长度

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

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

自动换行不会将字符串修剪掉,只需将其拆分...


0

$ width = 10;

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

或使用自动换行

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

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;
}

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;

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.