2013-05-25 69 views
0

對於我的項目,我需要分析不同的句子,並通過確定它們是否以問號結束來確定哪些是問題。PHP爆炸字符串,同時保留分隔符

所以我嘗試使用爆炸,但它不支持多個分隔符。我暫時將所有標點符號替換爲chr(1),以便我可以爆炸所有句子,而不管它們以(。,!,?等等)結尾。

然後我需要找到每個句子的最後一個字母,但爆炸函數已經刪除了所有的標點符號,所以我需要一些方法將它放回原處。

我花了很長時間才解決問題,但最終我破解了它。我在這裏發佈我的解決方案,以便其他人可以使用它。

回答

4

這裏是我的函數multipleExplodeKeepDelimiters。以及它如何被使用的,由爆炸字符串轉換成不同的句子,看是否最後一個字符是一個問號的例子:

function multipleExplodeKeepDelimiters($delimiters, $string) { 
    $initialArray = explode(chr(1), str_replace($delimiters, chr(1), $string)); 
    $finalArray = array(); 
    foreach($initialArray as $item) { 
     if(strlen($item) > 0) array_push($finalArray, $item . $string[strpos($string, $item) + strlen($item)]); 
    } 
    return $finalArray; 
} 

$punctuation = array(".", ";", ":", "?", "!"); 
$string = "I am not a question. How was your day? Sex On Hard Concrete Always Hurts The Orgasmic Area. Why does custard taste so lumpy when you use breast milk?"; 

$sentences = multipleExplodeKeepDelimiters($punctuation, $string); 
foreach($sentences as $question) { 
    if($question[strlen($question)-1] == "?") { 
     print("'" . $question . "' is a question<br />"); 
    } 
} 
+14

我必須說,這已經是最奇怪的例子字符串我見過。 –

+0

記得我見過的SOH CAH TOA的最佳方法! – IanS

6
$array = preg_split('~([.!?:;])~u',$raw , null, PREG_SPLIT_DELIM_CAPTURE); 
+0

Eww,正則表達式很混亂。 – CHRIS

+6

乾淨得多,比接受的答案還快。 –