Php 在忽略空格的情况下提取n个字符的子字符串

Php 在忽略空格的情况下提取n个字符的子字符串,php,regex,Php,Regex,我需要提取一个子字符串(例如22个字符),但在计算字符数时需要忽略空格。例如: $para = "While still in high school I signed up to participate in amateur night at the Educational Alliance. I wanted to show my mother I had talent."; 假设我需要得到包含前22个字符但不计算空格的子字符串子文件不起作用: echo substr($para, 0,

我需要提取一个子字符串(例如22个字符),但在计算字符数时需要忽略空格。例如:

$para = "While still in high school I signed up to participate in amateur night at the Educational Alliance. I wanted to show my mother I had talent.";
假设我需要得到包含前22个字符但不计算空格的子字符串<代码>子文件不起作用:

echo substr($para, 0, 22); // => While still in high sc
但我需要得到

// => While still in high school
我该怎么做

^(?=((?>.*?\S){20}))
试试这个。抓取捕获或组。参见演示


这将使用
lookahead
捕获
20组
任意字符和非空格字符
。准确地说,lookahead将搜索以
非空格
字符结尾的组。因为它是非贪婪的,它将首先搜索这样的
20个
组。

首先,使用
str_replace()
创建一个由$para组成的字符串$parawithoutspaces,不带空格,如下所示:

$parawithoutspaces=str_replace(" ", "", $para);
然后,使用substr()获取$parawithoutspaces的前20个字符,如下所示:

print substr($parawithoutspaces, 0, 20);
或者,将这两个步骤合并为一个步骤并消除对中间变量$parawithoutspaces的需要:

print substr(str_replace(" ", "", $para),0,20);

您只需要提供一个
字符串
和要从该
字符串
中提取的长度,函数将返回指定长度的字符串(是的,返回字符串中将包含空格,但字符串中不包含空格)

这是一个片段

$para = "While still in high school I signed up to participate in amateur night at the Educational Alliance. I wanted to show my mother I had talent.";
function getString($str, $length){
    $newStr = "";
    $counter = 0;
    $r = array();
    for($i=0; $i<strlen($str); $i++) 
         $r[$i] = $str[$i];

    foreach($r as $char){
        $newStr .= $char;
        if($char != " "){
            $counter += 1;  
        }

        //return string if length reached.
        if($counter == $length){
            return $newStr;
        }
    }
    return $newStr;
}

echo getString($para, 20);
//output: While still in high scho

echo getString($para, 22);
//output: While still in high school
$para=“还在读高中的时候,我报名参加了教育联盟的业余之夜。我想向妈妈展示我的天赋。”;
函数getString($str,$length){
$newStr=“”;
$counter=0;
$r=数组();

对于($i=0;$i您可以尝试此操作,这是我的代码,$result是您想要的最终字符串:

$arr1 = substr( $string,0,20);
$arr1 = explode(" ",$arr1);
array_pop($arr1);
$result = implode(" ",$arr1);

你想得到完整的单词吗?@JayBlanchard不,不是特别的,如果我需要得到完整的单词,我知道我可以搜索子字符串中的最后一个空格。那么你的问题就不太清楚了。如果你忽略空格,你会在高中时得到
,而不会像你要求的那样在最后得到完整的单词。你展示了吗
22
在您的代码中,但使用
20
作为您的for“例如”。
echo substr(str_replace(“,”,$para),0,20);
它是
substr
t
这个解决方案不起作用,因为我将它返回一个没有空格的子字符串,这不是我想要的。我想要的是得到一个有空格的子字符串,但空格不计入长度。实际上,它不显示有空格的结果。我想她会问你如何显示result by ignore the space,但仍然在end中显示空格此解决方案可以工作,我已经考虑过了,但是如果我需要1000个字符的子字符串,但我需要启动循环1000次。现在答案更好,但解决方案仍然不好。如果非空白字符少于20个,您的正则表达式就会崩溃fail()。当然,您可能应该使用
{1,20}
而不是
{20}
,这样它不会失败,但问题的根源是使用
*?
来“跳过”空白字符;你对
\s*
有什么反对意见?此外,前瞻是不必要的,而且随着它的消失,你也不需要捕获组。将
*?\s
放入原子组中会堵塞漏洞,但如果你使用
\s*
而不是
*?
,则不会堵塞漏洞。如果
\s*
耗尽0如果要匹配空白字符,而
\S
无法匹配下一个,则匹配会立即失败。至于前瞻,它的唯一效果是正则表达式不使用它匹配的字符,迫使您使用捕获组进行补偿。我可以知道如何将其语法组合到代码中吗?是的,我已经检查过了。但我只看到一行代码你的语法。我不知道如何将它与code@AgnesPalit ?