복붙노트

멀티 바이트 문자열을 n 개의 문자로 잘림

PHP

멀티 바이트 문자열을 n 개의 문자로 잘림

문자열 필터 작업에서이 메서드를 가져 오려고합니다.

public function truncate($string, $chars = 50, $terminator = ' …');

나는 이것을 기대할 것이다.

$in  = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWYXZ1234567890";
$out = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUV …";

또한이

$in  = "âãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝ";
$out = "âãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđ …";

$ chars에서 $ 종결 자 문자열의 문자를 뺀 값입니다.

또한 필터는 $ chars 한도 아래의 첫 번째 단어 경계에서 자르기로되어 있습니다.

$in  = "Answer to the Ultimate Question of Life, the Universe, and Everything.";
$out = "Answer to the Ultimate Question of Life, the …";

나는 이것이이 단계들과 잘 맞아야한다는 것을 확신한다.

그러나, 나는 지금 str *과 mb_ * 함수의 다양한 조합을 시도했지만, 모두 잘못된 결과를 산출했다. 이것은 그렇게 어려운 일이 아니므로 나는 분명히 뭔가를 놓치고 있습니다. 누군가가 이것을 위해 작동하는 구현을 공유 할 것인가, 아니면 어떻게하면 그것을 할 수있는지를 마침내 이해할 수있는 자원으로 안내 할 것인가?

감사

추신 예, 전에 https://stackoverflow.com/search?q=truncate+string+php를 확인했습니다. :)

해결법

  1. ==============================

    1.이 시도:

    이 시도:

    function truncate($string, $chars = 50, $terminator = ' …') {
        $cutPos = $chars - mb_strlen($terminator);
        $boundaryPos = mb_strrpos(mb_substr($string, 0, mb_strpos($string, ' ', $cutPos)), ' ');
        return mb_substr($string, 0, $boundaryPos === false ? $cutPos : $boundaryPos) . $terminator;
    }
    

    그러나 내부 인코딩이 제대로 설정되어 있는지 확인해야합니다.

  2. ==============================

    2.PHP가 이미 다중 바이트 잘라내기를 가졌음을 알았습니다.

    PHP가 이미 다중 바이트 잘라내기를 가졌음을 알았습니다.

    그것은 단어 경계를 순종하지 않습니다. 그러나 그럼에도 불구하고 편리하다!

  3. ==============================

    3.나는 보통 이와 같은 질문에 대한 전체 답을 작성하는 것을 좋아하지 않는다. 그러나 나는 또한 잠에서 깨어났다. 그리고 나는 아마도 당신의 질문이 나에게 하루의 나머지 시간 동안 프로그램을 가기에 좋은 기분으로 들어가게 될 것이라고 생각했다.

    나는 보통 이와 같은 질문에 대한 전체 답을 작성하는 것을 좋아하지 않는다. 그러나 나는 또한 잠에서 깨어났다. 그리고 나는 아마도 당신의 질문이 나에게 하루의 나머지 시간 동안 프로그램을 가기에 좋은 기분으로 들어가게 될 것이라고 생각했다.

    나는 이것을 실행하려고하지는 않았지만 적어도 90 %의 효과를 가져다 주어야합니다.

    function truncate( $string, $chars = 50, $terminate = ' ...' )
    {
        $chars -= mb_strlen($terminate);
        if ( $chars <= 0 )
            return $terminate;
    
        $string = mb_substr($string, 0, $chars);
        $space = mb_strrpos($string, ' ');
    
        if ($space < mb_strlen($string) / 2)
            return $string . $terminate;
        else
            return mb_substr($string, 0, $space) . $terminate;
    }
    
  4. from https://stackoverflow.com/questions/2154220/truncate-a-multibyte-string-to-n-chars by cc-by-sa and MIT license