我正在尝试构建一个修剪字符串的函数,因为它的规格太长了。
这就是我所拥有的:
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...
在单词之后添加延续。有什么想法吗?
我几乎不想在一个单词的中间添加延续。但是如果字符串只有一个单词,那么延续就可以打破这个单词。
答案 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;
}
?>
了解更多信息
答案 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
)不是你的问题(你已经使用它),要解决的问题是如何获得的位置最后一个字在限制之内。
这涉及分析字符串并找出每个单词的偏移量。字符串处理可以使用正则表达式完成。在写这篇文章时,它会让我想起一些实际上更为相似的问题,这个问题已经解决了:
wordwrap
)确实如此:使用正则表达式获取“完整单词”字符串。唯一的区别是,它删除了最后一个单词(而不是扩展它)。如果你想扩展最后一个单词,这需要一个不同的正则表达式模式。
在正则表达式中\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...
您可以通过减少模式中的最小长度(后缀的长度)来进一步扩展这一点(因为它在您的问题中以某种方式建议,但您在问题中提供的结果与您的代码不匹配)。
我希望这会有所帮助。另外请使用本网站上的搜索功能,它并不完美,但许多宝石隐藏在现有问题中以供替代方法使用。