รับ n ตัวแรกของสตริง


320

ฉันจะรับอักขระ n ตัวแรกของสตริงใน PHP ได้อย่างไร วิธีที่เร็วที่สุดในการตัดสตริงเป็นจำนวนอักขระเฉพาะคืออะไรและต่อท้าย '... ' หากจำเป็น?


5
อาจจะดีกว่าที่จะใช้อักขระจุดไข่ปลา ...
Keet

1
ตรวจสอบคำตอบของฉันหากคุณต้องการหลีกเลี่ยงการตัดคำ
TechNyquist


ลองใช้ลิงค์นี้อาจช่วยคุณได้ ... stackoverflow.com/a/26098951/3944217
edCoder

คำตอบ:


578
//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

3
ฉันชอบสิ่งนี้ แต่ฉันเปลี่ยนมันและใช้สิ่งต่อไปนี้เพื่อลบช่องว่างตอนท้าย: $ string = substr (ตัด ($ string), 0,10) .'... '; ด้วยวิธีนี้คุณจะได้รับ "ฉันชอบ ... " แทนที่จะเป็น "ฉันชอบ ... "
Kenton de Jong

28
"hellip" - เอาฉันบางครั้งที่จะเข้าใจเราไม่ได้พูดถึงที่อยู่ ip ของซาตาน
ลูคัสเบอร์นาโดเดอซูซา

2
การอัพเดต 3 มีประโยชน์มากที่สุด
milkovsky

ในกรณีที่มีฝาปิดที่ความยาวของสตริงที่ส่งคืนไม่ควรบรรทัด 5 ของการอัพเดต 3 เป็น$string = wordwrap($string, $length - sizeof($append)); อย่างไร
Michael Crenshaw

114

ฟังก์ชั่นนี้ถูกสร้างขึ้นใน PHP ตั้งแต่รุ่น 4.0.6 ดูเอกสาร

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

// outputs Hello W...

โปรดทราบว่าtrimmarker(จุดไข่ปลาด้านบน) รวมอยู่ในความยาวที่ถูกตัดทอน


4
ทำงานอย่างสมบูรณ์แบบสำหรับฉัน คำตอบยอดนิยมใช้งานไม่ได้และฉันดีใจที่มันไม่ได้เพราะเลื่อนไปเรื่อย ๆ และพบอัญมณีนี้
Eduardo

ขอบคุณฉันใช้วิธีนี้นานกว่า & เก่ากว่าเสมอ!
gr3g

1
แดนคุณอาจต้องการที่จะเจาะจงมากขึ้นว่าคำตอบยอดนิยมข้อใดไม่ได้ผลสำหรับคุณ ฟังก์ชั่น truncate () ทำงานได้อย่างสมบูรณ์แบบสำหรับฉันและประโยชน์ของคำตอบนั้นมากกว่าคำตอบของ bruchowski คือมันแบ่งตามขอบเขตของคำ สมมติว่าคุณสนใจเรื่องนั้น
pdwalker

2
จับดี! หลายพัฒนาประสบการณ์ PHP ไม่ทราบเกี่ยวกับฟังก์ชั่นนี้ :)
jroi_web

1
คำตอบด้านบน (ตอนนี้) ( stackoverflow.com/a/3161830/236306 ) ไม่ได้ทำอะไรเลย (ราวกับว่าฉันไม่ได้ใช้ fn เลย) ไม่รู้ทำไม คำตอบนี้ดูเหมือนจะสมบูรณ์แบบและมาพร้อมกับสิทธิประโยชน์เพิ่มเติมของการทำงาน
อลัน

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> และเมื่อฉันเชื่อมโยงมันมันจะเชื่อมโยงมันพร้อมกับจุดสามจุดซึ่งมันจะมาเป็นค่าที่แตกต่างกัน
fello

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 มีตัวช่วยนี้เรียกว่า "text helper" นี่คือเอกสารบางส่วนจากคู่มือผู้ใช้ของ 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;
            }       
        }
    }
}

4

ใช้สตริงย่อย

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

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

3
รหัสนี้จะเพิ่ม ... ในสตริงเสมอซึ่งเขาไม่ต้องการ
TravisO

คุณพูดถูกและฉันก็ได้แก้ไขคำตอบแล้ว (คำตอบที่ได้รับการแก้ไขในขณะนี้กำลังรอการตรวจสอบของเพื่อนร่วมงาน)
Chaya Cooper

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

จาก @Brendon Bullen ด้านบน .. $ string = (strlen ($ string)> 13)? substr ($ string, 0,10) .'... ': $ string; เยี่ยมมาก!
MarcoZen

1

ฟังก์ชั่นที่ฉันใช้:

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

เห็นมันในการดำเนินการ


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

คุณเพียงแค่เรียกใช้ฟังก์ชันด้วย 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
ไม่สามารถใช้งานได้เนื่องจากการตัดแต่ง ()มีอยู่แล้ว
กอร์ดอน

สามารถอธิบายได้ว่าทำไมวิธีนี้ดีที่สุดแทนที่จะแค่ยืนยันว่ามันเป็นอย่างไร
Robert

1
@ Robert มันง่ายและ abstracting หมายความว่าคุณไม่จำเป็นต้องพิมพ์รหัสซ้ำแล้วซ้ำอีก และที่สำคัญที่สุดหากคุณพบวิธีที่ดีกว่าในการทำสิ่งนี้หรือต้องการบางสิ่งที่ซับซ้อนกว่านี้คุณเพียงแค่เปลี่ยน 1 ฟังก์ชั่นนี้แทนรหัส 50 ชิ้น
TravisO

2
ทำไมฟังค์ชั่นนี้เป็นตัวพิมพ์ใหญ่?
Carlo

แก้ไข: substr ของ $ var ไม่ใช่ $ string ทดสอบกับ$limit + 3เพื่อที่คุณจะไม่ตัดสตริงเพียงเกินขีด จำกัด ขึ้นอยู่กับแอปพลิเคชันของคุณ (เช่นเอาต์พุต HTML) พิจารณาใช้เอนทิตี&hellip;แทน (เป็นที่ชื่นชอบการพิมพ์มากขึ้น) ตามที่แนะนำไว้ก่อนหน้าให้ตัดส่วนที่ไม่ใช่ตัวอักษรออกจากจุดสิ้นสุดของสตริง (สั้นลง) ก่อนที่จะผนวกจุดไข่ปลา สุดท้ายระวังว่าคุณอยู่ในสภาพแวดล้อมแบบมัลติไบต์ (เช่น UTF-8) - คุณไม่สามารถใช้ strlen () และ substr ()
Phil Perry

1

ฉันไม่แน่ใจว่านี่เป็นวิธีแก้ปัญหาที่เร็วที่สุดหรือไม่ แต่ดูเหมือนว่าจะเป็นวิธีที่สั้นที่สุด:

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

PS ดูตัวอย่างได้ที่นี่https://stackoverflow.com/a/17852480/131337


0

substr () จะดีที่สุดคุณจะต้องตรวจสอบความยาวของสตริงก่อน

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

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

wordwrap จะไม่ตัดเส้นสตริงลงเพียงแยกมัน ...


0

$ width = 10;

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

หรือด้วย wordwrap

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

0

วิธีนี้จะไม่ตัดคำมันจะเพิ่มสามจุดหลังจากช่องว่างแรก ฉันแก้ไข @ Raccoon29 solution และฉันได้แทนที่ฟังก์ชั่นทั้งหมดด้วยฟังก์ชั่น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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.