从字符串中获取前100个字符,尊重完整的单词

Jos*_*nie 65 php string

我之前在这里问过类似的问题,但我需要知道这个小调整是否可行.我想将一个字符串缩短为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)

  • 您收到该警告是因为内容短于200个字符(或您决定设置的任何限制).有一些事情要说,不要盲目地从Stack堆栈粘贴代码;-) (5认同)
  • 我有`strpos()[function.strpos]:偏移量不包含在字符串中为什么? (3认同)
  • 轻松活泼的!最终把它放在一个函数中.谢谢.我将添加字符串的其余部分(根据我的需要!)$ customer_name = substr($ customer_name,0,$ pos)."<br/>".substr($ customer_name,$ pos,strlen($ customer_name)); (2认同)
  • 正如@alumi所提到的,这可以使字符串长于所需的限制.请使用具有负偏移的strrpos查看我自己的答案以获得更好的解决方案. (2认同)

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调用的第二个参数,则会自动添加省略号.

  • 这只是一个了不起的解决方案. (4认同)

Tom*_*lak 20

如果将单词定义为"由空格分隔的字符序列"... strrpos()用于查找字符串中的最后一个空格,缩短到该位置,修剪结果.


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)

  • 是的我同意这比Amir的回答更好,因为它尊重确切的限制.但是为了进一步改进答案,您可以考虑使用多字节字符函数"mb_"来支持多字节字符,如阿拉伯语字符.如果在测试字符串中使用多字节字符,则函数将失败.使用"mb_strlen(),mb_substr(),mb_strpos"而不是"strlen(),substr(),strrpos()"/. (3认同)

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..."