2010-05-20 50 views
0

編輯:好的,我無法閱讀,感謝Col Shrapnel的幫助。如果有人來這裏尋找同樣的東西來回答...... print_r(preg_split('/([\!|\?|\.|\!\?])/', $string, null, PREG_SPLIT_DELIM_CAPTURE));分割字符串時保留分隔符

有沒有辦法在一組的分隔符分割字符串,並保留拆分後的位置和分隔符的字符(S) ?

例如,使用的!?.!?分隔符把這個:

$string = 'Hello. A question? How strange! Maybe even surreal!? Who knows.'; 

這個

array('Hello', '.', 'A question', '?', 'How strange', '!', 'Maybe even surreal', '!?', 'Who knows', '.'); 

目前我正在試圖用print_r(preg_split('/([\!|\?|\.|\!\?])/', $string));捕捉分隔符爲子模式,但我沒有多少運氣。

+2

爲什麼不閱讀函數的手冊頁?可能會有答案嗎?儘管要將分隔符作爲子模式來使用,您可以使用preg_match_all。但分割是最好的。只需養成一個習慣,先參閱手冊頁 – 2010-05-20 17:42:19

+1

Erp。剛回到網頁上,我現在要去眼鏡商買一副眼鏡:/我要失明瞭。 謝謝你讓我再看一遍:P – JoeC 2010-05-20 17:46:07

+0

請注意,你正在使用一個字符類。 '[\!| \?| \。| \!\?]'指的是字符'!','''','?'和'.'。你可能想要的是:'(!| \?| \。|!\?)'。或者用一個字符類:'([?。] |!\ ??)'。 – Gumbo 2010-05-20 17:50:54

回答

0

您的評論聽起來像你已經找到了相關標誌,但你的正則表達式是有點過,所以我要去反正補充一點:

preg_split('/(!\?|[!?.])/', $string, null, PREG_SPLIT_DELIM_CAPTURE); 

注意,這將在第一後,每字符串的開頭留有空格,所以你可能會希望通過trim()運行它們都管不好。

結果:

$string = 'Hello. A question? How strange! Maybe even surreal!? Who knows.'; 
print_r(preg_split('/(!\?|[!?.])/', $string, null, PREG_SPLIT_DELIM_CAPTURE)); 

Array 
(
    [0] => Hello 
    [1] => . 
    [2] => A question 
    [3] => ? 
    [4] => How strange 
    [5] => ! 
    [6] => Maybe even surreal 
    [7] => !? 
    [8] => Who knows 
    [9] => . 
    [10] => 
) 
0

只需將PREG_SPLIT_DELIM_CAPTURE添加到使preg_split功能:

$str = 'Hello. A question? How strange!'; 
$var = preg_split('/([!?.])/', $str, 0, PREG_SPLIT_DELIM_CAPTURE); 
$var = array(
    0 => "Hello", 
    1 => ".", 
    2 => " A question", 
    3 => "?", 
    4 => " How strange", 
    5 => "!", 
    6 => "", 
); 
0

您還可以將.!?!?後分裂的空間。但只有在可以保證在這樣的角色後面有空格的情況下才能使用。

你可以做到這一點,通過匹配但以積極的回顧:(<=\.|!?|?|!):這使得正則表達式

'/(?<=\.|\?|!) /' 

然後,你就必須檢查串與!?匹配結束:如果是這樣,則將最後兩個子串串起來。如果不是,則必須對最後一個字符進行子串處理。