2015-12-31 58 views
1

一個有這樣的:preg_match_all - 如何捕捉到所有的子模式

$pattern = "/\b(?:(one|two|three|four|five|(?:s|z)ix|seven|eight|nine|zero|twelve)(?:\s|-)*){4,8}/ix"; 
$subject = "one four-six nine twelve 
zero eight nine nine seven three six six"; 
$matches = []; 

preg_match_all ($pattern, $subject, $matches, PREG_SET_ORDER); 

我想看到的是$matches所有分離的話,但我只獲得九項第一和六爲第二 - 大格局的最後一句話。我知道我可以放在括號中的所有單個的詞,但有沒有什麼比較好的方式+我會得到空字符串這樣

輸出,如:

array (size=2) 
    0 => 
    array (size=2) 
     0 => string 'one four-six nine twelve 
zero eight nine ' (length=46) 
     1 => string 'one' 
     2 => string 'four' 
     3 => string 'six' 
     4 => string 'nine' 
     5 => string 'twelve' 
     6 => string 'zero' 
     7 => string 'eight' 
     8 => string 'nine' 
    1 => 
    array (size=2) 
     0 => string 'nine seven three six six' (length=24) 
     ... 
+0

請詳細說明您的預期輸出。 –

+0

您是否在尋找[類似的東西](http://ideone.com/O5pZb0)? –

+0

沒有。我添加了輸出,因爲我期待 – frenzy

回答

0

改變了代碼,以匹配所有的數字和增加了一個叫做命名組

<?php 
$pattern = '/\b(?<number>one|two|three|four|five|(?:s|z)ix|seven|eight|nine|zero|twelve)(?:\s|-)/'; 
$subject = "one four-six nine twelve 
zero eight nine nine seven three six six"; 
$matches = []; 

preg_match_all ($pattern, $subject, $matches, PREG_SET_ORDER); 
print_r($matches); 
?> 

這有十二個(全部)的結果。在regex101.com here上查看演示。

+1

那麼,他們從4到8分組的原因。 – frenzy

0

我希望看到的是$matches所有分離的話,但我越來越 只有九的第一和六爲第二 - 大格局的最後一句話。

不幸的是,這就是事情是這樣的,如對Repetition

當重複捕獲子模式,捕捉到的值是 串匹配的最後一次迭代。


我知道我可以放在括號中的所有單個的詞,但沒有任何更多的 好辦法...

一種方法是事後分裂找到匹配:

preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER); 
foreach ($matches as &$m) 
    // replace $m[1] with the split match 
    array_splice($m, 1, 1, preg_split('/\s|-/', $m[0], 0, PREG_SPLIT_NO_EMPTY)); 
unset($m); // remove the reference to the last element 

這將在$matches中產生所需的結果。