2013-05-12 48 views
2

我想要一個正則表達式來捕獲多個事件到一個組中。作爲一個例子,假設下面的語句:如何將多個子模式捕獲到一個捕獲?

cat | likes her | mat 
dog | goes to his | basket 

我希望能夠到這句話的每一個部分捕捉到固定位置

array(
    0 => cat likes her mat 
    1 => cat 
    2 => likes her 
    3 => mat 
) 

顯然使用:

$regex = '/(cat|dog)(likes| goes| to| his| her)* (mat|basket)/'; 
preg_match($regex, "The cat likes her mat", $m); 

給:

array(
    0 => cat likes her mat 
    1 => cat 
    2 => likes 
    3 => her 
    4 => mat 
) 

但是我總是希望$ m的墊子/籃子[3],不管中間有多少單詞匹配。

我已經試過這樣:

$regex = '/(cat|dog)(?:(likes| goes| to| his| her)*) (mat|basket)/'; 

,試圖阻止多子模式的拍攝,但是這會導致只有第一個字要即捕獲

array(
    0 => cat likes her mat 
    1 => cat 
    2 => likes 
    3 => mat 
) 

有誰知道我怎麼能捕捉短語的整個中間部分(未知數量的病房長度),但仍將其納入預測的輸出中。

btw我不能使用(cat|dog).*?(mat|basket),因爲只有在中間允許的指定單詞。

以上只是一個例子,實際使用的每個子模式都有更多的選項。

謝謝。

回答

2

你嘗試這種模式:

/\b(cat|dog) ((?: ?(?:likes|goes|to|his|her)\b)*) ?(mat|basket)\b/ 
+0

謝謝。在我的實際使用中,所有'單詞'都是固定長度,並且總是用空格分隔。所以這種模式正是我所需要的。 – 2013-05-12 17:43:07

+0

@IanBack:看到我的編輯,我添加了一個邊界(\ b) – 2013-05-12 17:46:12

+0

@CasimiretHippolyte:你也可以嘗試解決空的中間單詞問題來接受'貓墊'。 – 2013-05-12 17:50:05

1

如何這種模式?

$regex = '/\b(cat|dog)\b((?:\b(?:\s+|likes|goes|to|his|her)\b)*)\b(mat|basket)\b/'; 
preg_match($regex, "The cat likes her mat", $m); 

我有這樣的結果:

array (size=4) 
    0 => string 'cat likes her mat' (length=17) 
    1 => string 'cat' (length=3) 
    2 => string ' likes her ' (length=11) 
    3 => string 'mat' (length=3) 

我投卡西米爾的結果,但是他的模式返回上這些字符串誤報:

cat likesher mat 
cat likes her mat 
cat mat 
+0

謝謝。在我的實際使用中,所有'單詞'都是固定長度,並且總是用空格分隔。所以Casimir的模式就是我需要的。但是你的回答可能是我提出的更好的解決方案。 – 2013-05-12 17:45:06

+0

我很樂意幫助你們兩個。只要看到案例,如果你有文字*電機*,*週期*,但不是*摩托車* – 2013-05-12 17:47:39