2012-08-27 59 views
1

我試圖捕獲一個跟隨在PHP中的標題序列的單詞數量的一行,但我無法捕獲比第一個單詞更多的任何內容。下面是該文件的,我試圖匹配的內容:匹配任意數量的單詞正則表達式

Name: test 
Caption: test test test test 

,這裏是正則表達式的代碼和結果...

preg_match_all('/([A-z]+:)\s*(\w+)[\r|\r\n|\n]*/', $contents, $array); 

結果:

array(3) { 
    [0]=> array(2) { 
     [0]=> string(11) "Name: test " 
     [1]=> string(14) "Caption: test " 
    } 

    [1]=> array(2) { 
     [0]=> string(5) "Name:" 
     [1]=> string(8) "Caption:" 
    } 

    [2]=> array(2) { 
     [0]=> string(4) "test" 
     [1]=> string(4) "test" 
    } 
    } 

任何幫助將不勝感激。

+0

不會((?(\ w +)\ W +)+'工作嗎? –

+0

'[\ r | \ r \ n | \ n] *'也不是一個組,但匹配換行符'\ r'或'\ n'和'|'bar thingy。你可能也想在那裏使用'\ s *'。 – mario

回答

0

假設輸入數據總是看起來像你的榜樣(字幕段,結腸,也就是說,所有在同一行),這應該這樣做:

preg_match_all('/([A-Za-z]+:)\s*(.*)/', $contents, $array); 

這將導致$array[1]匹配類似Name: ,然後$array[2]將與該行的其餘部分匹配(您可能必須使用trim()$array[2]中去除任何前導和/或尾隨空白)。

如果你只想在第二部分中捕捉到「的話」,我相信你可以在第二捕獲組更改爲類似:

preg_match_all('/([A-Za-z]+:)\s*([\w\s]+)/', $contents, $array); 

還要注意的是,你不應該使用[A-z]結構,因爲大寫字母和小寫字母之間的ASCII表中存在非字母字符。查看ASCII Table獲取角色地圖。

相關問題