我想要一个帖子描述,但只显示第一个,例如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
先谢谢,我的数学很糟糕。
答案 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;
}
}
你最终得到:
我只需要第一个,我们只说