문자열의 처음 n자를 가져옵니다.


320

PHP에서 문자열의 처음 n자를 어떻게 얻을 수 있습니까? 문자열을 특정 문자 수로 자르고 필요한 경우 '...'을 추가하는 가장 빠른 방법은 무엇입니까?


5
줄임표 문자를 사용하는 것이 더 좋습니다 ...
Keet

1
단어를 자르지 않으려면 내 대답을 확인하십시오.
TechNyquist


이 링크를 사용해보십시오. 도움이 될 수 있습니다 ... stackoverflow.com/a/26098951/3944217
edCoder

답변:


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

3
나는 이것을 좋아하지만 그것을 변경하고 끝에 공백을 제거하기 위해 다음을 사용합니다. $ string = substr (trim ($ string), 0,10) .'... '; 이렇게하면 "I like to ..."대신 "I like to ..."와 같은 것을 얻을 수 있습니다.
Kenton de Jong

28
"hellip"– 우리가 사탄의 IP 주소에 대해 이야기하고 있지 않다는 것을 이해하기 위해 언젠가 나를 데려 갔다
Lucas Bernardo de Sousa

2
업데이트 3이 가장 유용합니다.
milkovsky

반환 된 문자열의 길이에 하드 캡이있는 경우 업데이트 3의 5 번째 줄이 $string = wordwrap($string, $length - sizeof($append)); ?
Michael Crenshaw 2016 년

114

이 기능은 버전 4.0.6부터 PHP에 내장되었습니다. 문서를 참조하십시오 .

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

// outputs Hello W...

있습니다 trimmarker(위의 생략)가 절단 길이에 포함됩니다.


4
나를 위해 완벽하게 일했습니다. 최고 답변이 작동하지 않았으며 계속 스크롤 하여이 보석을 찾았 기 때문에 기뻤습니다.
Eduardo Eduardo

감사합니다. 항상이 길고 오래된 방법을 사용했습니다!
gr3g

1
댄, 당신은 최고의 답변의 어느 부분이 당신에게 효과가 없었는지 좀 더 구체적으로하고 싶을 것입니다. truncate () 함수는 나를 위해 완벽하게 작동했으며 bruchowski의 대답에 대한 대답의 이점은 단어 경계를 깨는 것입니다. 그런 종류의 일에 관심이 있다고 가정합니다.
pdwalker

2
잘 잡아! 많은 숙련 된 PHP 개발자는이 기능에 대해 몰라요 :)
jroi_web

1
상단 (지금) 답변 ( stackoverflow.com/a/3161830/236306 )은 아무것도하지 않았습니다 (내가 fn을 전혀 사용하지 않은 것처럼). 이유를 모릅니다. 그러나이 답변은 완벽 해 보이며 작업의 추가 이점과 함께 제공됩니다.
Alan

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

이 코드는 문자열에 세 개의 점을 추가하고 있습니까? 내 코드에는 링크 태그 <a>가 있으며 링크 할 때 다른 값으로 제공되는 세 개의 점으로 연결됩니다.
fello

9

때로는 문자열을 마지막 완성 단어로 제한해야합니다. 즉, 마지막 단어가 깨지는 것을 원하지 않고 대신 두 번째 마지막 단어로 중지합니다.

예 : "This is my String"을 6 자로 제한해야하지만 'This i ...'대신 'This ...'가 되길 원합니다. 즉, 마지막 단어에서 깨진 문자를 건너 뜁니다.

휴, 설명하기에 좋지 않습니다. 코드는 다음과 같습니다.

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 (단어 _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) .'... ': $ 문자열; 좋아요!
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;
            }
        }

문자열을 사용하여 함수를 호출하고 제한
하십시오 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 ()이 이미 존재 하기 때문에 작동하지 않습니다 .
Gordon

왜이 방법이 최선이라고 주장하는 대신이 방법이 최선인지 설명 할 수 있습니까?
Robert

1
@Robert 간단하고 추상화는 코드를 반복해서 다시 입력 할 필요가 없음을 의미합니다. 가장 중요한 것은 더 좋은 방법을 찾거나 더 복잡한 것을 원하면 50 조각 코드 대신이 1 기능 만 변경하는 것입니다.
TravisO

2
왜 함수가 대문자입니까?
Carlo

수정 : $ 문자열이 아닌 $ var의 substr. 에 대한 테스트 $limit + 3당신이 문자열을 잘라하지 않도록 단지 한도를 초과. 응용 프로그램 (예 : HTML 출력)에 따라 &hellip;대신 엔터티 를 사용하는 것이 좋습니다 (인쇄 적으로 더 기쁘게). 앞에서 제안했듯이 줄임표를 추가하기 전에 줄이 짧아 진 문자열의 끝에서 문자가 아닌 문자를 잘라냅니다. 마지막으로 멀티 바이트 (예 : UTF-8) 환경에 있는지 확인하십시오. strlen () 및 substr ()을 사용할 수 없습니다.
Phil Perry


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

이 솔루션은 단어를 자르지 않고 첫 번째 공백 뒤에 3 개의 점을 추가합니다. @ 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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.