2009-10-07 67 views
11

希望这应该是一个快速和简单的使用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) 

谢谢您的帮助!

回答

36

尝试:

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

编辑

的简短解释:

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

\S只是character class[^\s]的简写。换句话说:它匹配除空白字符以外的单个字符。在*之后的+使字符类\Spossessive

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

总括来说,完整的正则表达式\s+(?=\S*+$)用简单的英语内容如下:

匹配一个或多个空格放眼望去那些空白字符不是空格字符以外的零个或多个字符,只有当,接着是字符串的结尾,可以看出。

+0

非常好,谢谢你,完美的作品。 只是为了理解,你能解释一下这个表达式的'(?= \ S * + $)'部分是如何工作的吗? – chattsm 2009-10-07 11:03:40

+0

不客气Martin。请参阅'编辑'以获取解释。 – 2009-10-07 11:49:39

+0

很棒Bart,谢谢。如果可以的话,我会给你更多的分数! – chattsm 2009-10-07 18:53:23

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); 
+0

谢谢汤姆,两个聪明的替代解决方案。 – chattsm 2009-10-07 18:56:32

0

如果\S*+ dupicated?只有/\s+(?=\S+$)//\s+(?=\S*$)/就足够取决于需要。

+0

不重复 - “* +”是单个命令,'\ S * +'通常比'\ S *'更高效。阅读“占有量词”了解更多详情。 – 2009-10-08 22:22:45

相关问题