2013-11-04 45 views
-1

我有這樣的文字:拆分文本由詞和標點符號

一件男人的夾克是綠色的。他 - 現代史上最大的明星 - 騎行速度非常快(每小時230公里)。這怎麼可能?!他使用了什麼樣的自行車?他的自行車的半自動裝置非常昂貴,極大地有助於達到這種速度。有些(或許多)聲稱他是世界上最快的! 「我看見他騎自行車!」約翰迪爾先生說。 「他設定的速度是每小時133.78公里,」這聽起來令人難以置信;聽起來很欺騙。

我想有以下結果數組:

words[1] = "A" 
words[2] = "man's" 
words[3] = "jacket" 
... 
words[n+1] = "color" 
words[n+2] = "." 
words[n+3] = "He" 
words[n+4] = "-" 
words[n+5] = "the" 
... 

這個數組應包括所有文字和標點符號分開。可以用regexp來執行嗎?任何人都可以幫助撰寫它嗎? 謝謝!

編輯:根據要求顯示我的工作。 我使用下面的函數處理的內容,但我想要做相同的正則表達式:

$text = explode(' ', $this->rawText); 
$marks = Array('.', ',', ' ?', '!', ':', ';', '-', '--', '...'); 
for ($i = 0, $j = 0; $i < sizeof($text); $i++, $j++) { 
    $skip = false; 
    //check if the word contains punctuation mark 
    foreach ($marks as $value) { 
     $markPosition = strpos($text[$i], $value); 
     //if contains separate punctation mark from the word 
     if ($markPosition !== FALSE) { 
      //check position of punctation mark - if it's 0 then probably it's punctuation mark by itself like for example dash 
      if ($markPosition === 0) { 
       //add separate mark to array 
       $words[$j] = new Word($j, $text[$i], 2, $this->phpMorphy); 
      } else { 
       $words[$j] = new Word($j, substr($text[$i], 0, strlen($text[$i]) - 1), 0, $this->phpMorphy); 
       //add separate mark to array 
       $punctMark = substr($text[$i], -1); 
       $j += 1; 
       $words[$j] = new Word($j, $punctMark, 1, $this->phpMorphy); 
      } 
      $skip = true; 
      break; 
     } 
    } 
    if (!$skip) { 
     $words[$j] = new Word($j, $text[$i], 0, $this->phpMorphy); 
    } 
} 
+4

你應該在解決問題 – AlexP

+3

http://stackoverflow.com/questions/16137575/preg-split-regex-for-splitting-a-sentence-into-發表您的嘗試單詞和標點符號 –

+0

結尾的單詞「?!'與單獨的'?'和'!'或單獨的'?!'結果?是否應該包括引號(如''''或''')?如果應該包含''',那麼你發佈的這種情況如何:'man's'? –

回答

1

以下將分裂你r特定文本。

$words = preg_split('/(?<=\s)|(?<=\w)(?=[.,:;!?()-])|(?<=[.,!()?\x{201C}])(?=[^ ])/u', $text); 

working demo

+0

謝謝,這幾乎是正確的。但是這個''''''''''''也應該是單獨的數組元素,以及'?!'。每個標點符號都必須放置在它自己的數組元素中。 –

+0

太棒了,非常感謝!唯一的事情是數組包含空格。例如,對於第8和第29個元素。我大概可以迭代數組並使用空格移除元素,但是如果您可以改進您的解決方案,那就太棒了。還有什麼機會可以詳細說明你所建議的正則表達式究竟做了什麼? –

+0

更新與修復 – hwnd

0

嘗試製作的preg_split使用。通過您的標點符號(所選的)的方括號內[]

<?php 
$str="A man’s jacket is of green color. He – the biggest star in modern history – rides bikes very fast (230 km per hour). How is it possible?! What kind of bike is he using? The semi-automatic gear of his bike, which is quite expensive, significantly helps to reach that speed. Some (or maybe many) claim that he is the fastest in the world! 「I saw him ride the bike!」 Mr. John Deer speaks. 「The speed he sets is 133.78 kilometers per hour,」 which sounds incredible; sounds deceiving."; 

$keywords=preg_split("/[-,. ]/", $str); 

print_r($keywords); 

OUTPUT:

陣列( [0] =>甲 [1 ] =>人的 [2] =>夾克 [3] =>是 [4] => [5] =>綠 [6] =>顏色 [7] => [8] =>他 [9] => - [10] =>的 [11] =>最大 [ 12] =>明星 [13] =>在 [14] =>現代 [15] =>歷史 [16] => -

消息截斷,以防止資源被濫用? Shankar;)

+0

看起來這個點應該在輸出數組中,所以按它分割也是沒有意義的。也請不要輸入helpvampires – HamZa

+0

是的,標點符號應該在數組中。 –