2016-08-23 73 views
-3

我希望使用正則表達式將字符串分解爲塊。我知道preg_split(),但我仍然在努力處理正則表達式(即使preg_split()會在這裏幫助)。我甚至不知道我是否應該誠實地使用Regex。如何將字符串拆分(「爆炸」)爲我定義的「塊」?

這裏就是我的意思是,如果我有一個像這樣的字符串:

?word word2 word3 "word4 word5 word6" 'word7' word8 

我想要的結果被分成數組是這樣的:

Array 
(
    [0] => ?word 
    [1] => word2 
    [2] => word3 
    [3] => word4 word5 word6 
    [4] => word7 
    [5] => word8 
) 

基本上是一個塊應分開由一個空格組成,但是你可以在一組字符周圍放置任何引號來形成這個塊。

我最初試圖用空白區域爆炸,然後連接以「或」開頭的值,直到達到以「或」結尾的值。但我認爲一定有更好的辦法。

謝謝!

+3

[str_getcsv()](http://www.php.net/manual/en/function.str-getcsv.php)用空格作爲分隔符參數,然後[array_walk()](http:/ /www.php.net/manual/en/function.array-walk.php)修剪任何單引號 –

+0

@bub對不起,我應該更清楚,我的壞。我最初試圖用一個空白區域進行爆炸,然後連接以「或」開頭的值,直到達到以「或」結尾的值。但我認爲一定有更好的方法,搜索大約20分鐘,然後來到這裏。 – Enstage

+0

@MarkBaker謝謝!我會給它一個鏡頭。 – Enstage

回答

1

使用(?|"(.*?)"|'(.*?)'|(\S+))捕獲所有需要的值成組中的一個陣列preg_match_all()

$str = "?word word2 word3 \"word4 word5 word6\" 'word7' word8"; 
$regex = "/(?|\"(.*?)\"|'(.*?)'|(\S+))/"; 
preg_match_all($regex, $str, $matches); 
print_r($matches[1]); 

演示:https://ideone.com/0AhB22

+0

謝謝!我打算只用一個分隔符來生活,但這是一個完美的解決方案。 – Enstage

0

感謝Mark Ba​​ker提供的解決方案^。

二手str_getcsv()到串分離像這樣:

$string = '?word word2 word3 "word4 word5 word6" word7'; 
$string = str_getcsv($string, ' ', '"', '\\'); 

產地:

Array 
(
    [0] => ?word 
    [1] => word2 
    [2] => word3 
    [3] => word4 word5 word6 
    [4] => word7 
) 
+0

'str_getcsv()'不允許使用多個分隔符,因此您不能在一個字符串中混合使用「...」和「...」。因此OP樣本輸入的'word7'不會被捕獲。 –

+0

@DmitryEgorov - 這就是爲什麼我在我的建議中使用array_walk來修剪'''字符以及 –

0

你可以嘗試以下的正則表達式和preg_match_all()

$regex = '/(?<=[\'"])(?:[^ "\'][^"\']*)|[^\'" ]+/'; 
$subject = '?word word2 word3 "word4 word5 word6" \'word7\' word8'; 

preg_match_all($regex, $subject, $result); 
var_dump($result[0]); 

我認爲你的塊不包含引號,除非它們被用於將多個單詞。