2016-01-12 35 views
0

我使用下面的PHP函數preg_match_all()創建一個包含多個單詞的數組。使用preg_match_all和正則表達式創建一個單詞數組

// the string wich contains the text 
$string = "Lorem ipsum dolor sit amet elit"; 

// the preg_match_all() function 
preg_match_all('/([a-z]*?)(?=)/i', $string, $matches); 

// debug array 
debug($matches[0]); 

// output 
[(int) 0 => 'Lorem', 
    (int) 1 => '', 
    (int) 2 => 'ipsum', 
    (int) 3 => '', 
    (int) 4 => 'dolor', 
    (int) 5 => '', 
    (int) 6 => 'sit', 
    (int) 7 => '', 
    (int) 8 => 'amet', 
    (int) 9 => '' 
] 

但是,當我調試或打印的所有字陣列,最後一個字從數組中刪除,在這種情況下,這將是單詞「ELIT」。我怎樣才能解決這個問題?

+0

因爲有在最後一個字之後沒有空格。你爲什麼用延遲匹配來使用lookahead?只需使用'/([a-z] +)/ i'。或匹配整個單詞:'/ \ b([a-z] +)\ b/i'。 –

+1

爲什麼不使用[str_word_count()](http://php.net/manual/en/function.str-word-count.php)格式值爲2 –

+1

@CodeWhisperer我沒有得到相同的結果你是。尋找正則表達式還有更多的錯誤,比如** amet,**不會被捕獲。 – mloureiro

回答

2

您可以使用(?= |$)作爲先行意味着一個Word是依次輸入的非單詞或結束:

preg_match_all('/([a-z]+)(?=\W|$)/i', $string, $matches); 

print_r($matches[0]); 

輸出:

Array 
(
    [0] => Lorem 
    [1] => ipsum 
    [2] => dolor 
    [3] => sit 
    [4] => amet 
    [5] => consectetur 
    [6] => adipiscing 
    [7] => elit 
    [8] => Lorem 
    [9] => ipsum 
    [10] => dolor 
    [11] => sit 
    [12] => amet 
    [13] => consectetur 
    [14] => adipiscing 
    [15] => elit 
) 

順便說一句,你可以使用得到同樣的拆分操作:

$tokens = preg_split('/\h+/', $string); 

\h匹配水平空白。

+1

這不匹配所有單詞,缺少那些有逗號的單詞。防爆。 'amet,''或'elit,' –

+0

謝謝,沒錯,那些單詞並沒有跟着空格。我已經進一步編輯了。 – anubhava

2

使用下面的正則表達式模式讓所有的話

\ W匹配任何單詞字符(字母,數字,下劃線)

preg_match_all('#\w+#', $string, $words); 
print_r($words); 

將輸出

Array 
(
    [0] => Array 
     (
      [0] => Lorem 
      [1] => ipsum 
      [2] => dolor 
      [3] => sit 
      [4] => amet 
      [5] => consectetur 
      [6] => adipiscing 
      [7] => elit 
      [8] => Lorem 
      [9] => ipsum 
      [10] => dolor 
      [11] => sit 
      [12] => amet 
      [13] => consectetur 
      [14] => adipiscing 
      [15] => elit 
     ) 

) 
+0

ping @Alex Andrei將'#\ w +#'更改爲正確的分隔符\/w + /' – mloureiro

+2

這是一個有效的分隔符,請參閱http://php.net/manual/en/regexp.reference.delimiters.php,我也更喜歡'/'因爲我不必逃避正斜線:) –

+0

不知道。感謝+1 – mloureiro