15

指定された文字列を、指定された単語数または指定された文字数のいずれか短い方に切り詰めるこの関数を思いつきました。次に、文字数または単語数の制限の後にすべてを切り捨てた後、文字列に「...」を追加します。

末尾の文字/単語を「...」に置き換えるのではなく、文字列の途中から文字/単語を削除して「...」に置き換えるにはどうすればよいですか?

これが私のコードです:

function truncate($input, $maxWords, $maxChars){
    $words = preg_split('/\s+/', $input);
    $words = array_slice($words, 0, $maxWords);
    $words = array_reverse($words);

    $chars = 0;
    $truncated = array();

    while(count($words) > 0)
    {
        $fragment = trim(array_pop($words));
        $chars += strlen($fragment);

        if($chars > $maxChars){
            if(!$truncated){
                $truncated[]=substr($fragment, 0, $maxChars - $chars);
            }
            break;
        }

        $truncated[] = $fragment;
    }

    $result = implode($truncated, ' ');

    return $result . ($input == $result ? '' : '...');
}

たとえば、truncate('the quick brown fox jumps over the lazy dog', 8, 16);が呼び出された場合、16 文字は短いため、切り捨てが行われます。そのため、「キツネが怠惰な犬を飛び越える」が削除され、「...」が追加されます。

しかし、代わりに、文字制限の半分を文字列の先頭から、半分を文字列の末尾から取得し、途中で削除されたものを「...」に置き換えるにはどうすればよいですか? したがって、この場合に返される文字列は、'the quic...lazy dog' になります。

4

3 に答える 3

34
$text = 'the quick brown fox jumps over the lazy dog';
$textLength = strlen($text);
$maxChars = 16;

$result = substr_replace($text, '...', $maxChars/2, $textLength-$maxChars);

$result は現在:

the quic...lazy dog
于 2013-06-01T05:12:12.187 に答える
7

これは より短い入力を変更せず$maxChars、置換の長さ...を考慮します:

function str_truncate_middle($text, $maxChars = 25, $filler = '...')
{
    $length = strlen($text);
    $fillerLength = strlen($filler);

    return ($length > $maxChars)
        ? substr_replace($text, $filler, ($maxChars - $fillerLength) / 2, $length - $maxChars + $fillerLength)
        : $text;
}
于 2016-08-05T12:36:16.660 に答える
3

これが私が最終的に使用したものです:

/**
 * Removes characters from the middle of the string to ensure it is no more
 * than $maxLength characters long.
 *
 * Removed characters are replaced with "..."
 *
 * This method will give priority to the right-hand side of the string when
 * data is truncated.
 *
 * @param $string
 * @param $maxLength
 * @return string
 */
function truncateMiddle($string, $maxLength)
{
    // Early exit if no truncation necessary
    if (strlen($string) <= $maxLength) return $string;

    $numRightChars = ceil($maxLength / 2);
    $numLeftChars = floor($maxLength / 2) - 3; // to accommodate the "..."

    return sprintf("%s...%s", substr($string, 0, $numLeftChars), substr($string, 0 - $numRightChars));
}

私の使用例では、文字列の右側の方がより有用な情報を含んでいたため、このメソッドは左側半分から文字を取り出すことに偏っています。

于 2016-05-22T18:11:47.483 に答える