如何计算字符串中前30个字母而忽略空格

时间:2016-11-17 20:24:02

标签: php

我想要一个帖子描述,但只显示第一个,例如30个字母,但忽略任何标签和空格。

$msg = 'I only need the first, let us just say, 30 characters; for the time being.';
$msg .= ' Now I need to remove the spaces out of the checking.';

$amount = 30;

// if tabs or spaces exist, alter the amount
if(preg_match("/\s/", $msg)) {
    $stripped_amount = strlen(str_replace(' ', '', $msg));
    $amount = $amount + (strlen($msg) - $stripped_amount);
}

echo substr($msg, 0, $amount);
echo '<br /> <br />';
echo substr(str_replace(' ', '', $msg), 0, 30);

第一个输出给了我'我只需要第一个,我们只说30个字符;',第二个输出给了我: Ionlyneedthefirst,letusjustsay 所以我知道这不能按预期工作。

在这种情况下,我想要的输出是:

I only need the first, let us just say

先谢谢,我的数学很糟糕。

5 个答案:

答案 0 :(得分:5)

您可以使用正则表达式获取前30个字符的部分:

$msg_short = preg_replace('/^((\s*\S\s*){0,30}).*/s', '$1', $msg);

使用给定的$msg值,您将进入$msg_short

  

我只需要第一个,我们只说

正则表达式

的说明
  • ^:匹配必须从字符串的开头
  • 开始
  • \s*\S\s*由零个或多个空格字符(\S)包围的非空格(\s*
  • (\s*\S\s*){0,30}重复查找此序列最多30次(贪婪;在该限制内尽可能多地获取)
  • ((\s*\S\s*){0,30})括号使这一系列字符组成为第1组,可以引用为$1
  • .*任何其他角色。这将匹配所有剩余的字符,因为最后的s修饰符:
  • s:使点匹配新行字符

在替换中,仅维护属于组1($1)的字符。所有其余的都被忽略,并且不包含在返回的字符串中。

答案 1 :(得分:3)

自发地,有两种方法可以实现我能想到的。

第一个接近你已经做过的事情。取前30个字符,计算空格并获取与找到空格一样多的下一个字符,直到新的字母组中没有空格为止。

$msg = 'I only need the first, let us just say, 30 characters; for the time being.';
$msg .= ' Now I need to remove the spaces out of the checking.';
$amount = 30;
$offset = 0;
$final_string = '';
while ($amount > 0) {
  $tmp_string = substr($msg, $offset, $amount);
  $amount -= strlen(str_replace(' ', '', $tmp_string));
  $offset += strlen($tmp_string);
  $final_string .= $tmp_string;
}
print $final_string;

第二种方法是在空格处爆炸你的字符串并将它们一个一个地放回去,直到你达到你的阈值(你最终需要将一个单词分成字符)。

答案 2 :(得分:0)

如果有效,请试试这个:

<?php
$string= 'I only need the first, let us just say, 30 characters; for the time being.';

echo "Everything: ".strlen($string);
echo '<br />';
echo "Only alphabetical: ".strlen(preg_replace('/[^a-zA-Z]/', '', $string));
?>

答案 3 :(得分:0)

可以这样做。

$tmp=str_split($string);//split the string
$result="";
$i=0;$j=0;
while(isset($tmp[$i]) && $j<30){
  if(trim($tmp[$i])){//test for non space and count
   $j++;
  }
 $result .= $tmp[$i++];
}
print $result;

答案 4 :(得分:0)

我不太了解正则表达式......

<?php
$msg = 'I only need the first, let us just say, 30 characters; for the time being. Now I need to remove the spaces out of the checking.';

$non_space_hit = 0;

for($i = 0; $i < strlen($msg); ++$i)
{
    echo $msg[$i];

    $non_space_hit+= (int)($msg[$i] !== ' ' && $msg[$i] !== "\t");

    if($non_space_hit === 30)
    {
        break;
    }
}

你最终得到:

  

我只需要第一个,我们只说