Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 截断字符串,但删除字符串的中间部分而不是结束部分_Php_String_Truncate - Fatal编程技术网

Php 截断字符串,但删除字符串的中间部分而不是结束部分

Php 截断字符串,但删除字符串的中间部分而不是结束部分,php,string,truncate,Php,String,Truncate,我提出了这个函数,它可以将给定的字符串截断为给定的字数或给定的字符数,只要更短。 然后,在删除了字符数或字数限制后的所有内容后,它会在字符串中附加一个“…” 如何删除字符串中间的字符/单词并将其替换为“…”,而不是将末尾的字符/单词替换为“…” 这是我的密码: function truncate($input, $maxWords, $maxChars){ $words = preg_split('/\s+/', $input); $words = array_slice($wo

我提出了这个函数,它可以将给定的字符串截断为给定的字数或给定的字符数,只要更短。 然后,在删除了字符数或字数限制后的所有内容后,它会在字符串中附加一个“…”

如何删除字符串中间的字符/单词并将其替换为“…”,而不是将末尾的字符/单词替换为“…”

这是我的密码:

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('敏捷的棕色狐狸跳过懒狗',8,16)时,16个字符较短,因此将发生截断。因此,“狐狸跳过懒狗”将被删除,并添加“…”

但是,我怎么可以有一半的字符限制来自字符串的开始,一半来自字符串的结尾,中间删除的是“…”。 所以,在这个例子中,我希望返回的字符串是:“quic…懒狗”

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

$result = substr_replace($text, '...', $maxChars/2, $textLength-$maxChars);
现在的结果是:

the quic...lazy dog

以下是我最终使用的:

/**
 * 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));
}
/**
*从字符串中间删除字符,以确保它不再存在
*长度超过$maxLength个字符。
*
*删除的字符将替换为“…”
*
*当出现以下情况时,此方法将优先考虑字符串的右侧
*数据被截断。
*
*@param$string
*@param$maxLength
*@返回字符串
*/
函数truncateMidle($string,$maxLength)
{
//如果不需要截断,请提前退出

如果(strlen($string)这不会改变短于
$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;
}

需要
if($textLength>$maxChars)
注意,即使$maxChars设置为16,也会产生一个19个字符的字符串。