Nhận n ký tự đầu tiên của chuỗi


320

Làm thế nào tôi có thể nhận được n ký tự đầu tiên của một chuỗi trong PHP? Cách nhanh nhất để cắt một chuỗi thành một số ký tự cụ thể và nối thêm '...' nếu cần là gì?


5
có thể tốt hơn để sử dụng ký tự dấu chấm lửng
Keet

1
kiểm tra câu trả lời của tôi nếu bạn cần tránh cắt từ.
TechNyquist


Hãy thử Liên kết này, có thể giúp bạn ... stackoverflow.com/a/26098951/3944217
edCoder

Câu trả lời:


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

Cập nhật:

Dựa trên đề xuất để kiểm tra độ dài (và cũng đảm bảo độ dài tương tự trên các chuỗi được cắt và không được phân loại):

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

Vì vậy, bạn sẽ nhận được một chuỗi tối đa 13 ký tự; 13 (hoặc ít hơn) ký tự bình thường hoặc 10 ký tự theo sau là '...'

Cập nhật 2:

Hoặc như chức năng:

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

Cập nhật 3:

Đã được một thời gian kể từ khi tôi viết câu trả lời này và tôi thực sự không sử dụng mã này nữa. Tôi thích chức năng này ngăn chặn việc ngắt chuỗi ở giữa một từ bằng cách sử dụng wordwrapchức năng:

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
có thể là tốt nhất để thay thế bằng dấu chấm lửng (Bắn) thay vì 3 dấu chấm (...)
Keet

3
Tôi thích điều này, nhưng tôi đã thay đổi nó và sử dụng cách sau để xóa khoảng trắng ở cuối: $ string = struct (trim ($ string), 0,10) .'... '; Bằng cách đó bạn sẽ có được thứ gì đó như "Tôi thích ..." thay vì "Tôi thích ...".
Kenton de Jong

28
"Hellip" - đôi khi khiến tôi hiểu rằng chúng tôi không nói về địa chỉ ip của satan
Lucas Bernardo de Sousa

2
Cập nhật 3 là hữu ích nhất.
milkovsky

Trong trường hợp có giới hạn cứng về độ dài của chuỗi được trả về, không nên dòng 5 của bản cập nhật 3 $string = wordwrap($string, $length - sizeof($append)); ?
Michael Crenshaw

115

Chức năng này đã được tích hợp vào PHP từ phiên bản 4.0.6. Xem tài liệu .

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

// outputs Hello W...

Lưu ý rằng trimmarker(dấu chấm lửng ở trên) được bao gồm trong chiều dài cắt ngắn.


4
Làm việc hoàn hảo cho tôi. Câu trả lời hàng đầu đã không hoạt động, và tôi rất vui vì nó đã không cuộn và tìm thấy viên ngọc này.
Eduardo

Cảm ơn bạn, tôi luôn sử dụng phương pháp này lâu hơn & cũ hơn!
gr3g

1
Dan, bạn có thể muốn cụ thể hơn một chút về phần nào của câu trả lời hàng đầu không phù hợp với bạn. Hàm cắt ngắn () hoạt động hoàn hảo đối với tôi và lợi thế của câu trả lời đó so với câu trả lời của bruchowski là nó phá vỡ các ranh giới từ; giả sử bạn quan tâm đến điều đó
pdwalker

2
nắm bắt tốt! nhiều nhà phát triển PHP có kinh nghiệm không biết về chức năng này :)
jroi_web

1
Câu trả lời hàng đầu (ngay bây giờ) ( stackoverflow.com/a/3161830/236306 ) không làm gì cả (như thể tôi chưa sử dụng fn nào cả). Không biết tại sao. Tuy nhiên, câu trả lời này có vẻ hoàn hảo và đi kèm với lợi ích bổ sung khi làm việc.
Alan

15

Phần mở rộng Multibyte có thể có ích nếu bạn cần kiểm soát bộ ký tự chuỗi.

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

Mã này đang thêm ba dấu chấm vào chuỗi? mã của tôi, nó có một thẻ liên kết <a> và khi tôi liên kết nó, nó sẽ liên kết nó với ba dấu chấm mà nó sẽ có giá trị khác nhau.
fello

9

đôi khi, bạn cần giới hạn chuỗi thành từ hoàn chỉnh cuối cùng, nghĩa là: bạn không muốn từ cuối cùng bị phá vỡ thay vào đó bạn dừng lại với từ cuối cùng thứ hai.

ví dụ: chúng ta cần giới hạn "Đây là Chuỗi của tôi" thành 6 ký tự nhưng thay vì 'Đây tôi ... "chúng tôi muốn nó là' Đây ..." tức là chúng tôi sẽ bỏ qua các chữ cái bị hỏng trong từ cuối cùng.

phew, xấu trong việc giải thích, đây là mã.

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

Nếu bạn muốn cắt cẩn thận để không chia từ, bạn có thể làm như sau

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

nếu $ str ngắn hơn $ n_chars, nó sẽ không bị ảnh hưởng.

Nếu $ str bằng với $ n_chars, thì nó cũng trả về.

nếu $ str dài hơn $ n_chars thì nó sẽ tìm khoảng trống tiếp theo để cắt hoặc (nếu không còn khoảng trống nào cho đến hết) $ str bị cắt một cách thô lỗ thay vào đó là $ n_chars.

LƯU Ý: lưu ý rằng phương pháp này sẽ xóa tất cả các thẻ trong trường hợp HTML.


8

Khung codeigniter chứa một trình trợ giúp cho việc này, được gọi là "trình trợ giúp văn bản". Dưới đây là một số tài liệu từ hướng dẫn sử dụng của codeigniter áp dụng: http://codeigniter.com/user_guide/helpers/text_helper.html (chỉ cần đọc phần word_limiter và character_limiter). Đây là hai chức năng liên quan đến câu hỏi của bạn:

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) . "...";

Từ @Brendon Bullen ở trên .. $ string = (strlen ($ string)> 13)? chất nền ($ chuỗi, 0,10) .'... ': $ chuỗi; Đẹp !
MarcoZen

1

Hàm tôi đã sử dụng:

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

Xem nó trong hành động .


1

đây là những gì tôi làm

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

trong đó $ num là viết tắt của số ký tự và $ tt chuỗi cho thao tác.


1

Tôi đã phát triển một chức năng cho việc sử dụng này

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

bạn chỉ cần gọi hàm với chuỗi và limite,
ví dụ : str_short("hahahahahah",5);
nó sẽ cắt chuỗi của bạn và thêm "..." vào cuối
:)


1

Để tạo trong một hàm (để sử dụng lặp lại) và độ dài giới hạn động, hãy sử dụng:

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

Tốt nhất là trừu tượng hóa mã của bạn như vậy (lưu ý giới hạn là tùy chọn và mặc định là 10):

print limit($string);


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

1
Điều đó sẽ không hoạt động vì trim () đã tồn tại.
Gordon

Có thể giải thích tại sao phương pháp này là tốt nhất thay vì chỉ khẳng định rằng nó là?
Robert

1
@Robert thật đơn giản và trừu tượng hóa có nghĩa là bạn không phải nhập lại mã nhiều lần. Và quan trọng nhất, nếu bạn tìm thấy một cách tốt hơn để làm điều này, hoặc muốn một cái gì đó phức tạp hơn, bạn chỉ thay đổi 1 chức năng này thay vì 50 đoạn mã.
TravisO

2
Tại sao chức năng là chữ hoa?
Carlo

Khắc phục: đế của $ var, không phải chuỗi $. Kiểm tra chống lại $limit + 3để bạn không cắt một chuỗi chỉ vượt quá giới hạn. Tùy thuộc vào ứng dụng của bạn (ví dụ: đầu ra HTML), hãy xem xét sử dụng một thực thể &hellip;thay thế (theo kiểu chữ đẹp hơn). Như đã đề xuất trước đó, hãy cắt bỏ mọi chữ cái không nằm ở cuối chuỗi (rút ngắn) trước khi nối thêm dấu chấm lửng. Cuối cùng, coi chừng bạn đang ở trong môi trường đa bào (ví dụ UTF-8) - bạn không thể sử dụng strlen () và chất nền ().
Phil Perry


0

chất nền () sẽ là tốt nhất, trước tiên bạn cũng sẽ muốn kiểm tra độ dài của chuỗi

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

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

wordwrap sẽ không cắt chuỗi xuống, chỉ cần tách nó ra ...


0

$ chiều rộng = 10;

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

hoặc với wordwrap

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

0

giải pháp này sẽ không cắt từ, nó sẽ thêm ba dấu chấm sau dấu cách đầu tiên. Tôi đã chỉnh sửa giải pháp @ Raccoon29 và tôi đã thay thế tất cả các hàm bằng các hàm mb_ để nó sẽ hoạt động cho tất cả các ngôn ngữ như tiếng Ả Rập

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

Nếu không có yêu cầu cứng về độ dài của chuỗi bị cắt, người ta có thể sử dụng điều này để cắt bớt và cũng ngăn cắt từ cuối cùng:

$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, " ")));

Trong trường hợp này, $previewsẽ được "Knowledge is a natural right of every human being".

Ví dụ về mã trực tiếp: http://sandbox.onlinephpfifts.com/code/25484a8b687d1f5ad93f62082b6379662a6b4713

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.