programing tip

전체 단어를 고려하여 문자열에서 처음 100 자 가져 오기

itbloger 2020. 11. 19. 07:55
반응형

전체 단어를 고려하여 문자열에서 처음 100 자 가져 오기


나는 전에 여기에서 비슷한 질문을했지만이 작은 조정이 가능한지 알아야합니다. 문자열을 100 자로 줄여서 사용하고 싶습니다 $small = substr($big, 0, 100);. 그러나 이것은 단지 처음 100 개의 문자 만 취하며 단어를 나누는 지 여부는 상관하지 않습니다.

문자열의 처음 100 자까지 사용할 수 있지만 단어를 분리하지 않는지 확인하는 방법이 있습니까?

예:

$big = "This is a sentence that has more than 100 characters in it, and I want to return a string of only full words that is no more than 100 characters!"

$small = some_function($big);

echo $small;

// OUTPUT: "This is a sentence that has more than 100 characters in it, and I want to return a string of only"

PHP를 사용하여이를 수행하는 방법이 있습니까?


다음을 사용하기 만하면됩니다.

$pos=strpos($content, ' ', 200);
substr($content,0,$pos ); 

네, 있습니다. 이것은 몇 년 전에 다른 포럼의 사용자로부터 빌린 기능이므로 크레딧을받을 수 없습니다.

//truncate a string only at a whitespace (by nogdog)
function truncate($text, $length) {
   $length = abs((int)$length);
   if(strlen($text) > $length) {
      $text = preg_replace("/^(.{1,$length})(\s.*|$)/s", '\\1...', $text);
   }
   return($text);
}

호출 '\\1'의 두 번째 매개 변수로 사용하지 않으려면 자동으로 생략 부호를 추가합니다 preg_replace.


단어를 "공백으로 구분 된 문자 시퀀스"로 정의하는 경우 ... strrpos()문자열의 마지막 공백을 찾는 데 사용 하고 해당 위치로 줄인 다음 결과를 잘라냅니다.


확실한. 가장 쉬운 방법은 아마도 preg_match 주위에 래퍼를 작성하는 것입니다 :

function limitString($string, $limit = 100) {
    // Return early if the string is already shorter than the limit
    if(strlen($string) < $limit) {return $string;}

    $regex = "/(.{1,$limit})\b/";
    preg_match($regex, $string, $matches);
    return $matches[1];
}

편집 : 문자열의 마지막 문자로 항상 공백을 포함하지 않도록 업데이트되었습니다 .


이것은 amir의 대답을 기반으로 한 내 접근 방식이지만 strrpos ()를 음수 오프셋으로 사용하여 어떤 단어도 문자열을 제한보다 길게 만들지 않습니다.

간단하지만 작동합니다. Laravel이 아닌 프로젝트에서 사용하려는 경우 Laravel의 str_limit () 도우미 함수와 동일한 구문을 사용하고 있습니다.

function str_limit($value, $limit = 100, $end = '...')
{
    $limit = $limit - mb_strlen($end); // Take into account $end string into the limit
    $valuelen = mb_strlen($value);
    return $limit < $valuelen ? mb_substr($value, 0, mb_strrpos($value, ' ', $limit - $valuelen)) . $end : $value;
}

이 함수는 "..."가능할 때마다 단어 경계 에 추가하여 문자열을 줄 입니다. 반환되는 문자열의 최대 길이 것 $len을 포함하여 "...".

function truncate($str, $len) {
  $tail = max(0, $len-10);
  $trunk = substr($str, 0, $tail);
  $trunk .= strrev(preg_replace('~^..+?[\s,:]\b|^...~', '...', strrev(substr($str, $tail, $len-$tail))));
  return $trunk;
}

출력 예 :

  • truncate("Thanks for contributing an answer to Stack Overflow!", 15)
    보고 "Thanks for..."
  • truncate("To learn more, see our tips on writing great answers.", 15)
    반환 "To learn more..."(쉼표도 잘림)
  • truncate("Pseudopseudohypoparathyroidism", 15)
    보고 "Pseudopseudo..."

이것은 나를 위해 잘 작동하며 스크립트에서 사용합니다.

<?PHP
$big = "This is a sentence that has more than 100 characters in it, and I want to return a string of only full words that is no more than 100 characters!";
$small = some_function($big);
echo $small;

function some_function($string){
     $string = substr($string,0,100);
     $string = substr($string,0,strrpos($string," "));
     return $string;
}
?>

행운을 빕니다


여기에 완전한 단어로 끝에 점이있는 훌륭한 솔루션이 있습니다.

function text_cut($text, $length = 200, $dots = true) {
    $text = trim(preg_replace('#[\s\n\r\t]{2,}#', ' ', $text));
    $text_temp = $text;
    while (substr($text, $length, 1) != " ") { $length++; if ($length > strlen($text)) { break; } }
    $text = substr($text, 0, $length);
    return $text . ( ( $dots == true && $text != '' && strlen($text_temp) > $length ) ? '...' : ''); 
}

입력 : Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut laboure et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

출력 : Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut laboure et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ...


허용 대답의 문제는, 그 결과 문자열이 한계를 넘어이기 때문에 100 개 문자를 초과 할 수 즉 strpos모양 항상있을 것입니다 오프셋 및 길이 귀하의 한계 이상. 마지막 단어가 길면 squirreled결과의 길이는 111 (아이디어 제공)이됩니다.

더 나은 해결책은 wordwrap함수 를 사용하는 것입니다.

function truncate($str, $length = 125, $append = '...') {
    if (strlen($str) > $length) {
        $delim = "~\n~";
        $str = substr($str, 0, strpos(wordwrap($str, $length, $delim), $delim)) . $append;
    } 

    return $str;
}


echo truncate("The quick brown fox jumped over the lazy dog.", 5);

이렇게하면 문자열이 한도 이하로 잘 렸는지 확인할 수 있습니다.

PS 이것은 VARCHAR (50) 등과 같은 고정 열을 사용하여 데이터베이스에 잘린 문자열을 저장하려는 경우 특히 유용합니다.

PPS 워드 랩의 특수 구분 기호에 유의하십시오. 이것은 문자열에 개행이 포함되어 있어도 올바르게 잘리는 지 확인하는 것입니다 (그렇지 않으면 원하지 않는 첫 번째 줄 바꿈에서 잘립니다).


이것은 나를 위해 그것을했다 ...

//trim message to 100 characters, regardless of where it cuts off
$msgTrimmed = mb_substr($var,0,100);

//find the index of the last space in the trimmed message
$lastSpace = strrpos($msgTrimmed, ' ', 0);

//now trim the message at the last space so we don't cut it off in the middle of a word
echo mb_substr($msgTrimmed,0,$lastSpace)

내 해결책은 다음과 같습니다.

/**
 * get_words_until() Returns a string of delimited text parts up to a certain length
 * If the "words" are too long to limit, it just slices em up to the limit with an ellipsis "..."
 *
 * @param $paragraph - The text you want to Parse
 * @param $limit - The maximum character length, e.g. 160 chars for SMS
 * @param string $delimiter - Use ' ' for words and '. ' for sentences (abbreviation bug) :)
 * @param null $ellipsis - Use '...' or ' (more)' - Still respects character limit
 *
 * @return string
 */
function get_words_until($paragraph, $limit, $delimiter = ' ', $ellipsis = null)
{
    $parts = explode($delimiter, $paragraph);

    $preview = "";

    if ($ellipsis) {
        $limit = $limit - strlen($ellipsis);
    }

    foreach ($parts as $part) {
        $to_add = $part . $delimiter;
        if (strlen($preview . trim($to_add)) <= $limit) { // Can the part fit?
            $preview .= $to_add;
            continue;
        }
        if (!strlen($preview)) { // Is preview blank?
            $preview = substr($part, 0, $limit - 3) . '...'; // Forced ellipsis
            break;
        }
    }

    return trim($preview) . $ellipsis;
}

귀하의 경우 (예제) :

$big = "This is a sentence that has more than 100 characters in it, and I want to return a string of only full words that is no more than 100 characters!"

$small = get_words_until($big, 100);

function truncate ($str, $length) {
    if (strlen($str) > $length) {
        $str = substr($str, 0, $length+1);
        $pos = strrpos($str, ' ');
        $str = substr($str, 0, ($pos > 0)? $pos : $length);
    }
    return $str;
}

예:

print truncate('The first step to eternal life is you have to die.', 25);

string (25) "영원의 첫 걸음"

print truncate('The first step to eternal life is you have to die.', 12);

string (9) "첫 번째"

print truncate('FirstStepToEternalLife', 5);

string (5) "처음"


이 질문을 부활시킨 것에 대해 사과했지만이 스레드를 우연히 발견하고 작은 문제를 발견했습니다. 주어진 제한을 초과하는 단어를 제거하는 문자 제한을 원하는 사람에게는 위의 답변이 훌륭합니다. 내 특정한 경우에는 한계가 단어의 중간에 있으면 단어를 표시하는 것을 좋아합니다. 다른 사람이이 기능을 찾고 있고 단어를 잘라내는 대신 포함해야하는 경우를 대비하여 솔루션을 공유하기로 결정했습니다.

function str_limit($str, $len = 100, $end = '...')
{
    if(strlen($str) < $len)
    {
        return $str;
    }

    $str = preg_replace("/\s+/", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str));

    if(strlen($str) <= $len)
    {
        return $str;
    }

    $out = '';
    foreach(explode(' ', trim($str)) as $val)
    {
        $out .= $val . ' ';

        if(strlen($out) >= $len)
        {
            $out = trim($out);
            return (strlen($out) == strlen($str)) ? $out : $out . $end;
        }
    }
}

예 :

  • 입력: echo str_limit('Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.', 100, '...');
  • 산출: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore...
  • 입력: echo str_limit('Lorem ipsum', 100, '...');
  • 산출: Lorem ipsum
  • 입력: echo str_limit('Lorem ipsum', 1, '...');
  • 산출: Lorem...

할 수있는 또 다른 방법이 있습니다.

$big = "This is a sentence that has more than 100 characters in it, and I want to return a string of only full words that is no more than 100 characters!"
$big = trim( $big );
$small = $big;
                if( strlen( $big ) > 100 ){
                $small = mb_substr( $small, 0, 100 );
                $last_position = mb_strripos( $small, ' ' );
                    if( $last_position > 0 ){
                    $small = mb_substr( $small, 0, $last_position );
                    }
                }

            echo $small; 

또는

 echo ( strlen( $small ) <  strlen( $big ) ? $small.'...' : $small );

이것은 또한 멀티 바이트 안전하고 공백이 없어도 작동합니다.이 경우 단순히 처음 100자를 반환합니다. 처음 100자를 취한 다음 끝에서 가장 가까운 단어 구분 기호까지 검색합니다.


또 다른 간단한 방법입니다.

function limit_words($string, $word_limit = 10)
{
    $words = explode(" ", $string);
    if (count($words) > $word_limit) {
        return implode(" ", array_splice($words, 0, $word_limit)) . ' ...';
    }
    return implode(" ", array_splice($words, 0, $word_limit));
}

wordwrap formats string according to limit, seprates them with \n so we have lines smaller than 50, ords are not seprated explodes seprates string according to \n so we have array corresponding to lines list gathers first element.

list($short) = explode("\n",wordwrap($ali ,50));

please rep Evert, since I cant comment or rep.

here is sample run

php >  $ali = "ali veli krbin yz doksan esikesiksld sjkas laksjald lksjd asldkjadlkajsdlakjlksjdlkaj aslkdj alkdjs akdljsalkdj ";
php > list($short) = explode("\n",wordwrap($ali ,50));
php > var_dump($short);
string(42) "ali veli krbin yz doksan esikesiksld sjkas"
php > $ali ='';
php > list($short) = explode("\n",wordwrap($ali ,50));
php > var_dump($short);
string(0) ""

Yet another answer! I wasn't completely satisfied with other answers, and wanted a 'hard cutoff' (guaranteed word break before $max_characters, if possible), so here's my function to contribute!

/**
 * Shortens a string (if necessary), trying for a non-word character before character limit, adds an ellipsis and
 * returns. Falls back to a forced cut if no non-word characters exist before.
 *
 * @param string $content
 * @param int    $max_characters - number of characters to start looking for a space / break.
 * @param bool   $add_ellipsis   - add ellipsis if content is shortened
 *
 * @return string
 */
public static function shorten( $content, $max_characters = 100, $add_ellipsis = TRUE ) {
    if ( strlen( $content ) <= $max_characters ) {
        return $content;
    }

    // search for non-word characters
    $match_count = preg_match_all( '/\W/', $content, $matches, PREG_OFFSET_CAPTURE );

    // force a hard break if can't find another good solution
    $pos = $max_characters;

    if ( $match_count > 0 ) {
        foreach ( $matches[0] as $match ) {
            // check if new position fits within
            if ( $match[1] <= $max_characters ) {
                $pos = $match[1];
            } else {
                break;
            }
        }
    }

    $suffix = ( $add_ellipsis ) ? '&hellip;' : '';

    return substr( $content, 0, $pos ) . $suffix;
}

## Get first limited character from a string ##

<?php 
  $content= $row->title;
  $result = substr($content, 0, 70);
  echo $result; 
  ?>

참고URL : https://stackoverflow.com/questions/972010/get-first-100-characters-from-string-respecting-full-words

반응형