PHP:拆分一个长字符串而不会破坏单词

时间:2022-01-31 02:49:50

I'm looking for something along the line of

我正在寻找沿线的东西

str_split_whole_word($longString, x)

where $longString is a collection of sentences, and x is the character length for each line. It can be fairly long, and I want to basically split it into multiple lines in the form of an array.

其中$ longString是句子的集合,x是每行的字符长度。它可能相当长,我想基本上以数组的形式将它分成多行。

So for example,

例如,

$longString = 'I like apple. You like oranges. We like fruit. I like meat, also.';
$lines = str_split_whole_word($longString, x);

$lines = Array(
    [0] = 'I like apple. You'
    [1] = 'like oranges. We'
    [2] = and so on...
)

5 个解决方案

#1


12  

This solution ensures that the lines will be created without breaking words, what you won't get using wordwrap(). It will use the space to explode the string and then use a foreach to loop the array and create the lines without breaking works and with a maximum length that is defined using $maxLineLength. Below is the code, i've done some tests and it works fine.

此解决方案可确保创建行而不会破坏单词,使用wordwrap()将无法获得。它将使用空间来爆炸字符串,然后使用foreach循环数组并创建行而不破坏工作并使用$ maxLineLength定义的最大长度。下面是代码,我做了一些测试,它工作正常。

$longString = 'I like apple. You like oranges. We like fruit. I like meat, also.';

$arrayWords = explode(' ', $longString);

$maxLineLength = 18;

$currentLength = 0;
$index = 0;

foreach ($arrayWords as $word) {
    // +1 because the word will receive back the space in the end that it loses in explode()
    $wordLength = strlen($word) + 1;

    if (($currentLength + $wordLength) <= $maxLineLength) {
        $arrayOutput[$index] .= $word . ' ';

        $currentLength += $wordLength;
    } else {
        $index += 1;

        $currentLength = $wordLength;

        $arrayOutput[$index] = $word;
    }
}

#2


41  

The easiest solution is to use wordwrap(), and explode() on the new line, like so:

最简单的解决方案是在新行上使用wordwrap()和explode(),如下所示:

$array = explode( "\n", wordwrap( $str, $x));

Where $x is a number of characters to wrap the string on.

其中$ x是要包装字符串的字符数。

#3


8  

Use wordwrap() to insert the linebreaks, then explode() on those linebreaks:

使用wordwrap()插入换行符,然后在这些换行符上爆炸():

// Wrap at 15 characters
$x = 15;
$longString = 'I like apple. You like oranges. We like fruit. I like meat, also.';
$lines = explode("\n", wordwrap($longString, $x));

var_dump($lines);
array(6) {
  [0]=>
  string(13) "I like apple."
  [1]=>
  string(8) "You like"
  [2]=>
  string(11) "oranges. We"
  [3]=>
  string(13) "like fruit. I"
  [4]=>
  string(10) "like meat,"
  [5]=>
  string(5) "also."
}

#4


1  

Made function from Marcio simao comment

从Marcio simao发表评论

function explodeByStringLength($string,$maxLineLength)
{
    if(!empty($string))
    {
        $arrayWords = explode(" ",$string);

        if(count($arrayWords) > 1)
        {
            $maxLineLength;
            $currentLength = 0;

            foreach($arrayWords as $word)
            {
                $wordLength = strlen($word);
                if( ( $currentLength + $wordLength ) <= $maxLineLength )
                {
                    $currentLength += $wordLength;
                    $arrayOutput[] = $word;
                }
                else
                {
                    break;
                }
            }

            return implode(" ",$arrayOutput);
        }
        else
        {
            return $string;
        }       
    }
    else return $string;
}

#5


1  

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

Credit: http://www.ebrueggeman.com/blog/abbreviate-text-without-cutting-words-in-half

#1


12  

This solution ensures that the lines will be created without breaking words, what you won't get using wordwrap(). It will use the space to explode the string and then use a foreach to loop the array and create the lines without breaking works and with a maximum length that is defined using $maxLineLength. Below is the code, i've done some tests and it works fine.

此解决方案可确保创建行而不会破坏单词,使用wordwrap()将无法获得。它将使用空间来爆炸字符串,然后使用foreach循环数组并创建行而不破坏工作并使用$ maxLineLength定义的最大长度。下面是代码,我做了一些测试,它工作正常。

$longString = 'I like apple. You like oranges. We like fruit. I like meat, also.';

$arrayWords = explode(' ', $longString);

$maxLineLength = 18;

$currentLength = 0;
$index = 0;

foreach ($arrayWords as $word) {
    // +1 because the word will receive back the space in the end that it loses in explode()
    $wordLength = strlen($word) + 1;

    if (($currentLength + $wordLength) <= $maxLineLength) {
        $arrayOutput[$index] .= $word . ' ';

        $currentLength += $wordLength;
    } else {
        $index += 1;

        $currentLength = $wordLength;

        $arrayOutput[$index] = $word;
    }
}

#2


41  

The easiest solution is to use wordwrap(), and explode() on the new line, like so:

最简单的解决方案是在新行上使用wordwrap()和explode(),如下所示:

$array = explode( "\n", wordwrap( $str, $x));

Where $x is a number of characters to wrap the string on.

其中$ x是要包装字符串的字符数。

#3


8  

Use wordwrap() to insert the linebreaks, then explode() on those linebreaks:

使用wordwrap()插入换行符,然后在这些换行符上爆炸():

// Wrap at 15 characters
$x = 15;
$longString = 'I like apple. You like oranges. We like fruit. I like meat, also.';
$lines = explode("\n", wordwrap($longString, $x));

var_dump($lines);
array(6) {
  [0]=>
  string(13) "I like apple."
  [1]=>
  string(8) "You like"
  [2]=>
  string(11) "oranges. We"
  [3]=>
  string(13) "like fruit. I"
  [4]=>
  string(10) "like meat,"
  [5]=>
  string(5) "also."
}

#4


1  

Made function from Marcio simao comment

从Marcio simao发表评论

function explodeByStringLength($string,$maxLineLength)
{
    if(!empty($string))
    {
        $arrayWords = explode(" ",$string);

        if(count($arrayWords) > 1)
        {
            $maxLineLength;
            $currentLength = 0;

            foreach($arrayWords as $word)
            {
                $wordLength = strlen($word);
                if( ( $currentLength + $wordLength ) <= $maxLineLength )
                {
                    $currentLength += $wordLength;
                    $arrayOutput[] = $word;
                }
                else
                {
                    break;
                }
            }

            return implode(" ",$arrayOutput);
        }
        else
        {
            return $string;
        }       
    }
    else return $string;
}

#5


1  

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

Credit: http://www.ebrueggeman.com/blog/abbreviate-text-without-cutting-words-in-half