如何在PHP中获取字符串的前n个字符?将字符串修剪为特定数量的字符并在需要时附加“ ...”的最快方法是什么?
如何在PHP中获取字符串的前n个字符?将字符串修剪为特定数量的字符并在需要时附加“ ...”的最快方法是什么?
Answers:
//The simple version for 10 Characters from the beginning of the string
$string = substr($string,0,10).'...';
更新:
基于检查长度的建议(并确保修剪后的和未修剪的琴弦的长度相似):
$string = (strlen($string) > 13) ? substr($string,0,10).'...' : $string;
因此,您将获得最多13个字符的字符串;13个(或更少)普通字符或10个字符,后跟“ ...”
更新2:
或作为功能:
function truncate($string, $length, $dots = "...") {
return (strlen($string) > $length) ? substr($string, 0, $length - strlen($dots)) . $dots : $string;
}
更新3:
自从我写了这个答案已经有一段时间了,我实际上不再使用此代码了。我更喜欢这个函数,它可以防止使用该wordwrap
函数在单词中间打断字符串:
function truncate($string,$length=100,$append="…") {
$string = trim($string);
if(strlen($string) > $length) {
$string = wordwrap($string, $length);
$string = explode("\n", $string, 2);
$string = $string[0] . $append;
}
return $string;
}
$string = wordwrap($string, $length - sizeof($append));
吗?
自版本4.0.6起,此功能已内置到PHP中。请参阅文档。
echo mb_strimwidth('Hello World', 0, 10, '...');
// outputs Hello W...
请注意,trimmarker
(上面的省略号)包含在截短的长度中。
如果需要控制字符串字符集,则可以使用Multibyte扩展名。
$charset = 'UTF-8';
$length = 10;
$string = 'Hai to yoo! I like yoo soo!';
if(mb_strlen($string, $charset) > $length) {
$string = mb_substr($string, 0, $length - 3, $charset) . '...';
}
有时,您需要将字符串限制为最后一个完整的单词,即:您不希望最后一个单词被打断,而是以第二个最后一个单词停止。
例如:我们需要将“这是我的字符串”限制为6个字符,但我们希望将其改为“这...”,而不是“这是我...”,即我们将跳过最后一个单词中的破损字母。
,不好解释,这是代码。
class Fun {
public function limit_text($text, $len) {
if (strlen($text) < $len) {
return $text;
}
$text_words = explode(' ', $text);
$out = null;
foreach ($text_words as $word) {
if ((strlen($word) > $len) && $out == null) {
return substr($word, 0, $len) . "...";
}
if ((strlen($out) + strlen($word)) > $len) {
return $out . "...";
}
$out.=" " . $word;
}
return $out;
}
}
如果您想节省时间不要分割单词,可以执行以下操作
function ellipse($str,$n_chars,$crop_str=' [...]')
{
$buff=strip_tags($str);
if(strlen($buff) > $n_chars)
{
$cut_index=strpos($buff,' ',$n_chars);
$buff=substr($buff,0,($cut_index===false? $n_chars: $cut_index+1)).$crop_str;
}
return $buff;
}
如果$ str短于$ n_chars,则返回原样。
如果$ str等于$ n_chars,则照原样返回它。
如果$ str的长度大于$ n_chars,则它将寻找下一个要剪切的空间,或者(如果没有多余的空间,直到结尾)$ str会被粗暴地剪切,而不是在$ n_chars。
注意:请注意,如果使用HTML,此方法将删除所有标记。
codeigniter框架为此包含一个帮助程序,称为“文本帮助程序”。这是适用于codeigniter的用户指南中的一些文档:http : //codeigniter.com/user_guide/helpers/text_helper.html(只需阅读word_limiter和character_limiter部分)。这是与您的问题相关的两个功能:
if ( ! function_exists('word_limiter'))
{
function word_limiter($str, $limit = 100, $end_char = '…')
{
if (trim($str) == '')
{
return $str;
}
preg_match('/^\s*+(?:\S++\s*+){1,'.(int) $limit.'}/', $str, $matches);
if (strlen($str) == strlen($matches[0]))
{
$end_char = '';
}
return rtrim($matches[0]).$end_char;
}
}
和
if ( ! function_exists('character_limiter'))
{
function character_limiter($str, $n = 500, $end_char = '…')
{
if (strlen($str) < $n)
{
return $str;
}
$str = preg_replace("/\s+/", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str));
if (strlen($str) <= $n)
{
return $str;
}
$out = "";
foreach (explode(' ', trim($str)) as $val)
{
$out .= $val.' ';
if (strlen($out) >= $n)
{
$out = trim($out);
return (strlen($out) == strlen($str)) ? $out : $out.$end_char;
}
}
}
}
我使用的功能:
function cutAfter($string, $len = 30, $append = '...') {
return (strlen($string) > $len) ?
substr($string, 0, $len - strlen($append)) . $append :
$string;
}
看到它在行动。
我为此开发了一个功能
function str_short($string,$limit)
{
$len=strlen($string);
if($len>$limit)
{
$to_sub=$len-$limit;
$crop_temp=substr($string,0,-$to_sub);
return $crop_len=$crop_temp."...";
}
else
{
return $string;
}
}
你只需要调用的函数的字符串和LIMITE
例如:str_short("hahahahahah",5)
;
它将剪切您的字符串并在末尾添加“ ...”
:)
要在一个函数中创建(重复使用)并动态限制长度,请使用:
function string_length_cutoff($string, $limit, $subtext = '...')
{
return (strlen($string) > $limit) ? substr($string, 0, ($limit-strlen(subtext))).$subtext : $string;
}
// example usage:
echo string_length_cutoff('Michelle Lee Hammontree-Garcia', 26);
// or (for custom substitution text
echo string_length_cutoff('Michelle Lee Hammontree-Garcia', 26, '..');
最好像这样抽象您的代码(注意限制是可选的,默认为10):
print limit($string);
function limit($var, $limit=10)
{
if ( strlen($var) > $limit )
{
return substr($string, 0, $limit) . '...';
}
else
{
return $var;
}
}
$limit + 3
,这样你就不会修剪字符串刚刚超过限制。根据您的应用程序(例如,HTML输出),请考虑使用一个实体…
(在样式上更令人愉悦)。如前所述,在附加省略号之前,请剪除(缩短的)字符串末尾的所有非字母。最后,请注意是否处于多字节(例如UTF-8)环境中-不能使用strlen()和substr()。
我不确定这是否是最快的解决方案,但看起来它是最短的解决方案:
$result = current(explode("\n", wordwrap($str, $width, "...\n")));
PS在这里看到一些例子 https://stackoverflow.com/a/17852480/131337
此解决方案不会剪切单词,它将在第一个空格后添加三个点。我编辑了@ Raccoon29解决方案,并用mb_函数替换了所有函数,以使其适用于所有语言,例如阿拉伯语
function cut_string($str, $n_chars, $crop_str = '...') {
$buff = strip_tags($str);
if (mb_strlen($buff) > $n_chars) {
$cut_index = mb_strpos($buff, ' ', $n_chars);
$buff = mb_substr($buff, 0, ($cut_index === false ? $n_chars : $cut_index + 1), "UTF-8") . $crop_str;
}
return $buff;
}
$yourString = "bla blaaa bla blllla bla bla";
$out = "";
if(strlen($yourString) > 22) {
while(strlen($yourString) > 22) {
$pos = strrpos($yourString, " ");
if($pos !== false && $pos <= 22) {
$out = substr($yourString,0,$pos);
break;
} else {
$yourString = substr($yourString,0,$pos);
continue;
}
}
} else {
$out = $yourString;
}
echo "Output String: ".$out;
如果对截断的字符串的长度没有严格要求,则可以使用它来截断并防止截断最后一个单词:
$text = "Knowledge is a natural right of every human being of which no one
has the right to deprive him or her under any pretext, except in a case where a
person does something which deprives him or her of that right. It is mere
stupidity to leave its benefits to certain individuals and teams who monopolize
these while the masses provide the facilities and pay the expenses for the
establishment of public sports.";
// we don't want new lines in our preview
$text_only_spaces = preg_replace('/\s+/', ' ', $text);
// truncates the text
$text_truncated = mb_substr($text_only_spaces, 0, mb_strpos($text_only_spaces, " ", 50));
// prevents last word truncation
$preview = trim(mb_substr($text_truncated, 0, mb_strrpos($text_truncated, " ")));
在这种情况下,$preview
将为"Knowledge is a natural right of every human being"
。
实时代码示例:http : //sandbox.onlinephpfunctions.com/code/25484a8b687d1f5ad93f62082b6379662a6b4713