我之前在这里问过类似的问题,但我需要知道这个小调整是否可行.我想将一个字符串缩短为100个字符并使用$small = substr($big, 0, 100);它.但是,这只需要前100个字符,并不关心它是否会破坏一个单词.
有没有办法接受一个字符串的前100个字符但确保你不会破坏一个字?
例:
$big = "This is a sentence that has more than 100 characters in it, and I want to return a string of only full words that is no more than 100 characters!"
$small = some_function($big);
echo $small;
// OUTPUT: "This is a sentence that has more than 100 characters in it, and I want to return a string of only"
Run Code Online (Sandbox Code Playgroud)
有没有办法用PHP做到这一点?
小智 129
您需要做的就是使用:
$pos=strpos($content, ' ', 200);
substr($content,0,$pos );
Run Code Online (Sandbox Code Playgroud)
tj1*_*111 37
就在这里.这是我几年前从不同论坛上的用户借来的功能,所以我不能相信它.
//truncate a string only at a whitespace (by nogdog)
function truncate($text, $length) {
$length = abs((int)$length);
if(strlen($text) > $length) {
$text = preg_replace("/^(.{1,$length})(\s.*|$)/s", '\\1...', $text);
}
return($text);
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果您不希望仅将其'\\1'用作preg_replace调用的第二个参数,则会自动添加省略号.
Pat*_*and 13
当然.最简单的可能就是在preg_match周围写一个包装器:
function limitString($string, $limit = 100) {
// Return early if the string is already shorter than the limit
if(strlen($string) < $limit) {return $string;}
$regex = "/(.{1,$limit})\b/";
preg_match($regex, $string, $matches);
return $matches[1];
}
Run Code Online (Sandbox Code Playgroud)
编辑:更新为不总是包含空格作为字符串中的最后一个字符
OMA*_*OMA 11
这是我的方法,基于amir的答案,但它不会让任何单词使字符串长于限制,通过使用带负偏移的strrpos().
简单但有效.我使用与Laravel的str_limit()辅助函数相同的语法,以防你想在非Laravel项目中使用它.
function str_limit($value, $limit = 100, $end = '...')
{
$limit = $limit - mb_strlen($end); // Take into account $end string into the limit
$valuelen = mb_strlen($value);
return $limit < $valuelen ? mb_substr($value, 0, mb_strrpos($value, ' ', $limit - $valuelen)) . $end : $value;
}
Run Code Online (Sandbox Code Playgroud)
dal*_*ege 10
此函数通过"..."尽可能在单词边界处添加来缩短字符串.返回的字符串将有一个最大长度$len,包括"...".
function truncate($str, $len) {
$tail = max(0, $len-10);
$trunk = substr($str, 0, $tail);
$trunk .= strrev(preg_replace('~^..+?[\s,:]\b|^...~', '...', strrev(substr($str, $tail, $len-$tail))));
return $trunk;
}
Run Code Online (Sandbox Code Playgroud)
示例输出:
truncate("Thanks for contributing an answer to Stack Overflow!", 15)"Thanks for..."truncate("To learn more, see our tips on writing great answers.", 15) "To learn more..."(逗号也被截断)truncate("Pseudopseudohypoparathyroidism", 15) "Pseudopseudo..."