php修剪一个字符串

时间:2012-01-25 02:29:15

标签: php string

我正在尝试构建一个修剪字符串的函数,因为它的规格太长了。

这就是我所拥有的:

function trim_me($s,$max) 
{
    if (strlen($s) > $max) 
    {
        $s = substr($s, 0, $max - 3) . '...';
    }
    return $s;
}

如果字符串长于$max,则会修剪字符串,并会添加续集...

我想扩展该功能以处理多个单词。目前它完成了它的工作,但如果我有一个字符串说:How are you today?长度为18个字符。如果我运行trim_me($s,10),它将显示为How are yo...,这在美学上并不令人愉悦。我该怎么做才能在整个单词之后添加...。假如我运行trim_me($s,10)我希望它显示How are you...在单词之后添加延续。有什么想法吗?

我几乎不想在一个单词的中间添加延续。但是如果字符串只有一个单词,那么延续就可以打破这个单词。

4 个答案:

答案 0 :(得分:0)

function trim_me($s,$max) {
    if( strlen($s) <= $max) return $s;
    return substr($s,0,strrpos($s," ",$max-3))."...";
}

strrpos是实现魔力的功能。

答案 1 :(得分:0)

所以,这就是你想要的:

<?php
// Original PHP code by Chirp Internet: www.chirp.com.au 
// Please acknowledge use of this code by including this header.
function myTruncate($string, $limit, $break=".", $pad="...") { 
    // is $break present between $limit and the end of the string? 
    if(false !== ($breakpoint = strpos($string, $break, $limit))) { 
        if($breakpoint < strlen($string) - 1) { 
            $string = substr($string, 0, $breakpoint) . $pad; 
        } 
    } 
    return $string;
}
?>

此外,您可以在http://www.the-art-of-web.com/php/truncate/

了解更多信息

答案 2 :(得分:0)

我已将函数命名为str_trunc。你可以指定strict为TRUE,在这种情况下,它只允许最大大小的字符串而不是更多,否则它将搜索它即将完成的单词中最短的字符串。

var_dump(str_trunc('How are you today?', 10)); // string(10) "How are..."
var_dump(str_trunc('How are you today? ', 10, FALSE)); // string(14) "How are you..."

// Returns a trunctated version of $str up to $max chars, excluding $trunc.
// $strict = FALSE will allow longer strings to fit the last word.
function str_trunc($str, $max, $strict = TRUE, $trunc = '...') {
    if ( strlen($str) <= $max ) {
        return $str;
    } else {
        if ($strict) {
            return substr( $str, 0, strrposlimit($str, ' ', 0, $max + 1) ) . $trunc;
        } else {
            return substr( $str, 0, strpos($str, ' ', $max) ) . $trunc;
        }
    }
}

// Works like strrpos, but allows a limit
function strrposlimit($haystack, $needle, $offset = 0, $limit = NULL) {
    if ($limit === NULL) {
        return strrpos($haystack, $needle, $offset);
    } else {
        $search = substr($haystack, $offset, $limit);
        return strrpos($search, $needle, 0);
    }
}

答案 3 :(得分:0)

它实际上有点简单,我添加了这个答案,因为the suggested duplicate不符合您的需求(但确实提供了一些指示)。

你想要的是剪切一个字符串最大长度但保留最后一个字。所以你需要找出切割弦的位置(如果实际上需要切割它的话)。

由于获得长度(strlen)和剪切字符串(substr)不是你的问题(你已经使用它),要解决的问题是如何获得的位置最后一个字在限制之内。

这涉及分析字符串并找出每个单词的偏移量。字符串处理可以使用正则表达式完成。在写这篇文章时,它会让我想起一些实际上更为相似的问题,这个问题已经解决了:

确实如此:使用正则表达式获取“完整单词”字符串。唯一的区别是,它删除了最后一个单词(而不是扩展它)。如果你想扩展最后一个单词,这需要一个不同的正则表达式模式。

在正则表达式中\b匹配单词边界。那是在一个词之前或之后。您现在想要选择至少 $length个字符,直到下一个字边界。

由于这可能在下一个单词之前包含空格,因此您可能需要修剪结果以在结尾处删除这些空格。

您可以使用正则表达式模式(preg_replace)和trim扩展您的功能,如下所示:

/**
 * Cut a string at length while preserving the last word.
 * 
 * @param string $str
 * @param int $length
 * @param string $suffix (optional)
 */
function trim_word($str, $length, $suffix = '...') 
{
    $len = strlen($str);

    if ($len < $length) return $str;

    $pattern = sprintf('/^(.{%d,}?)\b.*$/', $length);
    $str = preg_replace($pattern, '$1', $str);
    $str = trim($str);
    $str .= $suffix;

    return $str;
}

用法:

$str = 'How are you today?';
echo trim_word($str, 10); # How are you...

您可以通过减少模式中的最小长度(后缀的长度)来进一步扩展这一点(因为它在您的问题中以某种方式建议,但您在问题中提供的结果与您的代码不匹配)。

我希望这会有所帮助。另外请使用本网站上的搜索功能,它并不完美,但许多宝石隐藏在现有问题中以供替代方法使用。