2011-02-10 117 views
1

假設我們有一個命令解析器輸入,其中給定字符(在這種情況下是一個點)服務於兩個功能:將字符串拆分爲其他命令,並指示解析器重複最後的命令。用重複模式分割字符串,保留分隔符

例如:

go north.pick up item.go west...go north.. 

什麼,這將實現的是「北上,拿起項目,往西走三次,北上兩次」。但是,使用preg_split時,我無法獲得所需的輸出。

所有我到現在是:

$temp = 'go north.pick up item.go west...go north..'; 
preg_split('/\.)/', $temp); 

其產生:

陣列

[0] =>北上
[1] =>拾item
[2] =>去西
[3] =>
[4] =>
[5] =>北上
[6] =>
[7] =>

這顯然是在兩種情況下不正確 - 沒有點返回和一個額外的在結束命令。點必須返回,所以我們的解析器可以計算出用戶想要重複他們的最後一個命令。

儘管使用(\.)作爲正則表達式,但使用PREG_SPLIT_DELIM_CAPTURE的效果並不理想。

回答

0
preg_match_all('~([^.]+)(\.+)~', $input, $matches, PREG_SET_ORDER); 
foreach ($matches as $match) { 
    // $match[1] is what to do and $match[2] contains the dots. 
    echo 'Do ', $match[1], ' ', strlen($match[2]), ' times', "\n"; 
} 

參見preg_match_all作進一步參考。

1
<?php 

$temp = 'go north.pick up item.go west...go north..'; 
preg_match_all('/[^.]*\./', $temp, $r); 
var_dump($r); 

請參閱http://ideone.com/a7o7v瞭解輸出結果。