正则表达式只用最后一个空白字符分割字符串

时间:2009-10-07 10:53:58

标签: php regex string split

希望这应该是一个快速而简单的方法,使用PHP我试图将一个字符串拆分成一个数组,但仅限于最后一个空格实例。到目前为止,我有......

$str="hello this is     a    space";
$arr=preg_split("/\s+/",$str);
print_r($arr);

Array ( [0] => hello [1] => this [2] => is [3] => a [4] => space ) 

...按空白的所有实例分割。

如何将此正则表达式展开以仅按空白的最后一个实例进行拆分?成为......

Array ( [0] => hello this is     a [1] => space ) 

先谢谢你的帮助!

3 个答案:

答案 0 :(得分:44)

尝试:

$arr=preg_split("/\s+(?=\S*+$)/",$str);

修改

一个简短的解释:

(?= ... )被称为正look ahead。例如,a(?=b)只会匹配单个'a',如果下一个字符(右边的那个)是'b'。请注意,'b' 不是匹配的一部分!

\S只是character class [^\s]的缩写。换句话说:它匹配除空格字符以外的单个字符。 +之后*制作角色等级\S possessive

最后,$表示字符串的结尾。

总结一下,完整的正则表达式\s+(?=\S*+$)将以简单的英语读取如下:

  

只有在向前看那些空格字符时才匹配一个或多个空格字符,可以看到除空白字符以外的零个或多个字符,后跟字符串的结尾。

答案 1 :(得分:2)

这应该有效:

$str="hello this is a  space";

preg_match('~^(.*)\s+([^\s]+)$~', $str, $matches);
$result = array($matches[1], $matches[2]);

你可以在没有正则表达式的情况下完成:

$parts = array_map('trim', explode(' ', $str));
$result = array(
    implode(' ', array_slice($parts, 0, -1)),
    end($parts)
);

$lastSpace = strrpos($str, ' ');
$str1 = trim(substr($str, 0, $lastSpace));
$str2 = trim(substr($str, $lastSpace));
$result = array( $str1, $str2 );

答案 2 :(得分:0)

如果*之后的+\S重复了吗?只有/\s+(?=\S+$)//\s+(?=\S*$)/足够取决于需要。