IT TIP

PHP substr이 문자가 아닌 단어로 끝나는 지 확인

itqueen 2020. 12. 31. 23:12
반응형

PHP substr이 문자가 아닌 단어로 끝나는 지 확인


substr 함수를 사용하는 방법을 알고 있지만 이것은 단어 중간에 문자열을 끝낼 것입니다. 문자열이 단어의 끝에서 끝나기를 원합니다. 어떻게해야합니까? 정규 표현식을 포함합니까? 어떤 도움이라도 대단히 감사합니다.

이것이 제가 지금까지 가지고있는 것입니다. 그냥 SubStr ...

echo substr("$body",0,260);

건배


정규식으로 수행 할 수 있습니다. 다음과 같이 문자열의 시작 부분에서 단어 경계까지 최대 260 개의 문자를 얻을 수 있습니다.

$line=$body;
if (preg_match('/^.{1,260}\b/s', $body, $match))
{
    $line=$match[0];
}

또는 wordwrap 함수를 사용 하여 $ body를 줄로 나누고 첫 번째 줄을 추출 할 수 있습니다.


substr($body, 0, strpos($body, ' ', 260))

이것을 시도 할 수 있습니다.

   $s = substr($string, 0, 261);
   $result = substr($s, 0, strrpos($s, ' '));

다음과 같이 할 수 있습니다. 260 번째 문자에서 첫 번째 공백을 찾아 자르기 표시로 사용합니다.

$pos = strpos($body, ' ', 260);
if ($pos !== false) {
    echo substr($body, 0, $pos);
}

이 솔루션을 사용합니다.

$maxlength = 50;
substr($name, 0, ($spos = strpos($name, ' ', $lcount = count($name) > $maxlength ? $lcount : $maxlength)) ? $spos : $lcount );

또는 인라인 :

substr($name, 0, ($spos = strpos($name, ' ', $lcount = count($name) > 50 ? $lcount : 50)) ? $spos : $lcount );

function substr_word($body,$maxlength){
    if (strlen($body)<$maxlength) return $body;
    $body = substr($body, 0, $maxlength);
    $rpos = strrpos($body,' ');
    if ($rpos>0) $body = substr($body, 0, $rpos);
    return $body;
}

wordwrap 및 explode 다음 첫 번째 배열 요소는 원하는 것입니다. $wr=wordwrap($text,20,':'); $strs=explode(":",$wr); $strs[0]


$pos = strpos($body, $wordfind);
echo substr($body,0, (($pos)?$pos:260));

이건 어때?

/**
 * @param string $text
 * @param int $limit
 * @return string
 */
public function extractUncutPhrase($text, $limit)
{
    $delimiters = [',',' '];
    $marks = ['!','?','.'];

    $phrase = substr($text, 0, $limit);
    $nextSymbol = substr($text, $limit, 1);


    // Equal to original
    if ($phrase == $text) {
        return $phrase;
    }
    // If ends with delimiter
    if (in_array($nextSymbol, $delimiters)) {
        return $phrase;
    }
    // If ends with mark
    if (in_array($nextSymbol, $marks)) {
        return $phrase.$nextSymbol;
    }

    $parts = explode(' ', $phrase);
    array_pop($parts);

    return implode(' ', $parts); // Additioanally you may add ' ...' here.
}

테스트 :

public function testExtractUncutPhrase()
{
    $stringUtils = new StringUtils();

    $text = 'infant ton-gue could make of both names nothing';
    $phrase = 'infant';

    $this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 11));
    $this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 12));

    $text = 'infant tongue5';
    $phrase = 'infant';

    $this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 13));
    $this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 11));
    $this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 7));
}

public function testExtractUncutPhraseEndsWithDelimiter()
{
    $stringUtils = new StringUtils();

    $text = 'infant tongue ';
    $phrase = 'infant tongue';

    $this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 13));

    $text = 'infant tongue,';
    $phrase = 'infant tongue';

    $this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 13));
}

public function testExtractUncutPhraseIsSentence()
{
    $stringUtils = new StringUtils();

    $text = 'infant tongue!';
    $phrase = 'infant tongue!';

    $this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 14));
    $this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 100));

    $text = 'infant tongue!';
    $phrase = 'infant tongue!';

    $this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 13));

    $text = 'infant tongue.';
    $phrase = 'infant tongue.';

    $this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 13));
}

Try This Function..

<?php
/**
 * trims text to a space then adds ellipses if desired
 * @param string $input text to trim
 * @param int $length in characters to trim to
 * @param bool $ellipses if ellipses (...) are to be added
 * @param bool $strip_html if html tags are to be stripped
 * @param bool $strip_style if css style are to be stripped
 * @return string
 */
function trim_text($input, $length, $ellipses = true, $strip_tag = true,$strip_style = true) {
    //strip tags, if desired
    if ($strip_tag) {
        $input = strip_tags($input);
    }

    //strip tags, if desired
    if ($strip_style) {
        $input = preg_replace('/(<[^>]+) style=".*?"/i', '$1',$input);
    }

    if($length=='full')
    {

        $trimmed_text=$input;

    }
    else
    {
        //no need to trim, already shorter than trim length
        if (strlen($input) <= $length) {
        return $input;
        }

        //find last space within length
        $last_space = strrpos(substr($input, 0, $length), ' ');
        $trimmed_text = substr($input, 0, $last_space);

        //add ellipses (...)
        if ($ellipses) {
        $trimmed_text .= '...';
        }       
    }

    return $trimmed_text;
}
?>

public function Strip_text($data, $size, $lastString = ""){
    $data = strip_tags($data);          
    if(mb_strlen($data, 'utf-8') > $size){
        $result = mb_substr($data,0,mb_strpos($data,' ',$size,'utf-8'),'utf-8');
            if(mb_strlen($result, 'utf-8') <= 0){
            $result = mb_substr($data,0,$size,'utf-8');
            $result = mb_substr($result, 0, mb_strrpos($result, ' ','utf-8'),'utf-8');;         
        }
        if(strlen($lastString) > 0) {
            $result .= $lastString;
        }
    }else{
    $result = $data;
    }
    return $result; 
}

Pass the string into funtion Strip_text("Long text with html tag or without html tag", 15) Then this function will return the first 15 character from the html string without html tags. When string less than 15 character then return the full string other wise it will return the 15 character with $lastString parameter string.

Example:

Strip_text("<p>vijayDhanasekaran</p>", 5)

Result: vijay

Strip_text("<h1>vijayDhanasekaran<h1>",5,"***....")

Result: vijay***....

ReferenceURL : https://stackoverflow.com/questions/1233290/making-sure-php-substr-finishes-on-a-word-not-a-character

반응형