使用PHP substr,我如何找到以前的空格而不是以下的空格?

时间:2016-07-23 00:24:27

标签: php string whitespace

我想在空白之前裁掉一个字符串这个被切断的单词。目前我有工作代码用于裁剪之后的空白字符串被切断的单词,但这超出了我的最大字符数限制。

我做了一些实验,我找到了一个找到空白的解决方案,这样strpos就可以找到字符限制然后裁剪的单词后面的空格,而不是剪切一个单词的中间位置。字符串。

$thestring = "my really really really really really really really";
$getlength = strlen($thestring);
$maxLength = 42;

if ($getlength > $maxLength) { 
    echo substr($thestring, 0, strpos($thestring, ' ', $maxLength));
    echo "...";
} else {
    echo $thestring;
}
echo " - long string";

这是完全有效的,唯一的一点是,我想对字符串中的字符数加硬限制。但是,它的作用就是在它落在两者之间的字之后裁剪,这使得它超出了极限。

例如,这将返回此字符串:

my really really really really really really - long string

因为42个字符落在最后一个"真的",所以它将长度扩展到下一个空格。但现在返回的字符串是44个字符。

我宁愿这样做,因为确切的42个字符会返回:

my really really really really really real

然后,我想把它裁剪到之前的空格,而不是以下的空格。就像在这个例子中一样,我希望这个回归:

my really really really really really - long string

这很好,因为它裁掉了最后一个部分单词,所以不是只返回看起来很糟糕的最后一个单词real的一部分,而是之后整个单词{{1超过我的最大字符限制,然后它会裁剪部分最后一个字,导致总字符串低于最大限制,这就是我想要的。

所以我上面想要的返回字符串就是37个字符,这就是我想要的,因为它不到42个。

那么,如何修改我的代码以将前一个空格裁剪为maxLength结束的单词,而不是后面的空格呢?

4 个答案:

答案 0 :(得分:1)

确定。我不知道为什么我的代码样本对你不起作用(这真的很奇怪): - /

但这是基于您的来源的完整代码:

<?php
$thestring = "my really really really really really really really";
$getlength = strlen($thestring);
$maxLength = 42;

if ($getlength > $maxLength) {
    echo substr($thestring, 0, strrpos($thestring, ' ', $maxLength-$getlength));
    echo "...";
} else {
    echo $thestring;
}
echo " - long string";

我的控制台输出:

   [64] $ php ./ex.php
   my really really really really really... - long string

答案 1 :(得分:0)

你必须使用strpos和substr试试这段代码:

$content = "my really really really really really really really";

$pos=strpos($content, ' ', 20);
$new = substr($content,0,$pos );

$fromfirstwhitespace = preg_replace('/\W\w+\s*(\W*)$/', '$1', $new);

echo ($fromfirstwhitespace);

欢呼声!!!

答案 2 :(得分:0)

不是很好的方法,但至少它可以工作。

  1. 你有$ strlen = 42
  2. 切割此字符串以匹配$ strlen
  3. 按空间分解新字符串
  4. 打印出最后一个的所有数组值。
  5. 修改

    这是代码,实际上我对它不是很满意,但它至少有效。

    $str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
    $strLength = 42;
    $strCut = substr($str, 0, $strLength);
    $strExp = explode(" ", $strCut);
    
    $newTxtSize = count($strExp) - 2;
    
    $output = "";
    for($i = 0; $i <= $newTxtSize; $i++){
        $output .= $strExp[$i] .' ';
    }
    
    echo rtrim($output,  " ") . "...";
    

答案 3 :(得分:0)

一种短函数,默认情况下不剪切,不剪切,也不剪切到想要的字符数之后的下一个找到的空格...

function cut_string($nb_chars, $str){
      
      // define a nb chart by defaut
      $nb_chars_default = 250;
      
      // use default or number wanted
      $nb_chars = ( $nb_chars != 0
      || $nb_chars != '' ) ? $nb_chars : $nb_chars_default;
      
      // size of the string in nb chars
      $len_str = strlen($str);

      // if the string is too long
      if( $len_str > $nb_chars ){
        
        // cut string just at the first space after nb chars wanted
        return substr( $str, 0, strrpos($str, ' ', $nb_chars-$len_str) );
      }
      else{

        return $str;
      }
}

// use :
$str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum";

$my_cut_string = cut_string(200, $str);

echo $my_cut_string;

// output :
// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut