希望这应该是一个快速而简单的方法,使用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 )
先谢谢你的帮助!
答案 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*$)/
足够取决于需要。