2013-03-06 58 views
0

我試圖找到字符串中的所有比賽。出於某種原因,如果我的匹配是在字符串的開頭,它不會返回該特定的匹配。它與索引0有關嗎?我也使用PREG_OFFSET_CAPTURE來獲取索引與匹配。以下是不工作的代碼。PHP preg_match_all沒有找到第一場比賽

$text = '[QUOTE]I wonder why[QUOTE]PHP[IMG]hates me[/IMG][/QUOTE][/QUOTE][URL="http://www.bing.com"]Click me![QUOTE]........[/QUOTE]Ok Bai![/URL]'; 
preg_match_all('#\[QUOTE\]#', $text, $matches, PREG_OFFSET_CAPTURE, PREG_PATTERN_ORDER); 
print_r($matches); 

其結果是:

陣列([0] =>數組([0] =>數組([0] => [QUOTE] [1] => 19)[1 ] =>數組([0] => [QUOTE] [1] => 100)))

正如你可以看到它僅發現了兩個匹配。如果我在字符串的開頭添加一個字符,它會找到所有三個字符。其中

$text = 'a[QUOTE]I wonder why[QUOTE]PHP[IMG]hates me[/IMG][/QUOTE][/QUOTE][URL="http://www.bing.com"]Click me![QUOTE]........[/QUOTE]Ok Bai![/URL]'; 
preg_match_all('#\[QUOTE\]#', $text, $matches, PREG_OFFSET_CAPTURE, PREG_PATTERN_ORDER); 
print_r($matches); 

結果是:

陣列([0] =>數組([0] =>數組([0] => [QUOTE] [1] = 1>)[1 ] =>陣列([0] => [QUOTE] [1] => 20)[2] => Array([0] => [QUOTE] [1] => 101)))

All three火柴。如果任何人都可以幫我弄清楚我的REGEX是否需要修改,或者如果有一些怪癖,我不知道它會非常感激。我已經嘗試了使用Python和re庫的同樣的事情,並且它返回了我所有的匹配。我也利用這個http://www.regextester.com/,它報告它在兩種情況下工作,並按照它應該匹配的一切。我唯一的猜測是與PREG_OFFSET_CAPTURE在位置0找到一個匹配和0導致一些問題有關。

預先感謝任何幫助!

回答

3

正確的方式來增加多個標誌是與管道|,所以:

preg_match_all('#\[QUOTE\]#', $text, $matches, PREG_OFFSET_CAPTURE | PREG_PATTERN_ORDER); 

,之前PREG_PATTERN_ORDER也就是說,它變成了「偏移」參數(此時字符串中開始),和作爲PREG_PATTERN_ORDER == 1,它從第二個字符開始。

+0

+1比我好...... – jeroen 2013-03-06 20:19:02

+0

你是一個聖人Wrikken,如果有一種方式來提示你,我會做到這一點:d – Skylude 2013-03-06 22:52:25

0

的問題是在你的function call

preg_match_all('#\[QUOTE\]#', $text, $matches, PREG_OFFSET_CAPTURE, PREG_PATTERN_ORDER); 

第五個參數是偏移,而不是其他標誌。