2009-10-07 100 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

相關問題