2013-08-26 96 views
1

我想從PHP的preg_match提取一個字符串中的特定單詞的所有索引。舉個例子的話helloPHP preg_match返回錯誤的索引

$r = "/\b(hello)\b/u"; 

比方說,我想看看它在這個字符串:

$s = 'hello. how are you, hello there. helloorona!'; 

如果我運行preg_matchPREG_OFFSET_CAPTURE參數傳遞一個數組名爲$比賽,

preg_match($r, $s, $matches, PREG_OFFSET_CAPTURE); 

我期望返回這樣的事情(即忽略了最後一個「hellooroona」語):

["hello", 0], ["hello", 20] 

但事實上,當我返回或者通過json_encode或者通過遍歷所有的比賽呼應$matches值,返回的值始終是:

["hello", 0], ["hello", 0] 

如果我在一個類似的字符串運行此,讓我們說

$s = 'how are you, hello there.'; 

答案是

["hello", 13] 

這是正確的。運行它hello hello hello,我得到三個指標,均爲0

摘要

所以它看起來像指數計數器被簡單地總是返回的第一個索引。這是預期的行爲?我如何獲得實際的索引?

+0

最後的招呼沒有展示,因爲你正在使用'\ B'這是字邊界例如,任何事情之前/之後是不發一言它會捕獲它的字符。 – Class

回答

1

第二個["hello", 0]不是您的字符串中的第二個hello,而是子組的匹配。

使用preg_match_all這將給你預期的結果:

// note: sub group is not necessary 
$r = "/\bhello\b/u"; 
$s = 'hello. how are you, hello there. helloorona!'; 
preg_match_all($r, $s, $matches, PREG_OFFSET_CAPTURE); 
+0

是的,你說得對,我試過使用'preg_match_all',但也沒有得到我期待的東西 - 刪除子組是最終解決它的。謝謝! –

2

preg_match匹配第一個匹配然後停止。結果數組總是包含的整個匹配表達0索引和所有捕獲組,其索引從1開始。例如: -

preg_match('/foo (\w+)/', 'foo bar', $r) 

$r這裏包含0 => 'foo bar', 1 => 'bar'

所以在你的情況下,你只會看到第一個hello兩次因此。

如果要匹配全部出現的表達式,請使用preg_match_all