2016-02-19 71 views
6

我有一個這樣的字符串:如何在正則表達式中創建動態捕獲組?

$str =" 
- group1 
- group2 
- group3 
"; 

我也有這個regex

/(\-\s\w+)\n(\-\s\w+)\n(\-\s\w+)/ 

如你所知,還有爲三個捕獲組:$1$2$3。我手動製作了這些組。我的意思是如果我追加到上面的字符串:

- group4 
- group5 

然後,該正則表達式不匹配它們。


嗯,我有一個不變的模式:(\-\s\w+),我想在字符串中的匹配項目的數量創建分離捕獲組。野兔是幾個例子:

例1:

$str=" 
- group 1 
"; 

我需要一個正則表達式的$1給我所有的字符串。


例2:

$str=" 
- group 1 
- group 2 
"; 

我需要一個正則表達式的$1和第二線(- group 2)由$2


好了,給我的字符串(- group 1)的第一線那麼,正如你在上面的例子中看到的那樣,字符串是動態的,但是它是根據consta nt模式...現在我想知道如何根據字符串創建動態捕獲組?

+2

爲什麼要捕獲組? 'preg_match_all('/ - 。* /',$ str,$ matches);' – AbraCadaver

+0

偶爾會出現這個問題。 PHP PCRE正則表達式中的每個捕獲組都沒有堆棧。如上所示使用多個匹配。總是有辦法解決這個限制。 –

+0

呃,也許你正在做替換... – AbraCadaver

回答

1

的不可能捕獲重複基團是一個well known limitation

如果你知道最大的重複模式,您可以設置爲正則表達式(即最多= 5):

/(\-\s\w+)\n(\-\s\w+)?\n?(\-\s\w+)?\n?(\-\s\w+)?\n?(\-\s\w+)?\n?/ 

,你會發現從組一到五場比賽從1到5
實質上,您必須重複(\-\s\w+)?\n?以獲得重複模式的最大可能數量。

否則,如果你的最大可能數量是不確定的,我不知道其他方式比建立一個動態的模式,如:

$regex = '(\-\s\w+)\n'; 
$regex = '/'.(str_repeat($regex, preg_match_all("/$regex/", $str, $matches))).'/'; 

將上面的圖案作品,但我不知道你的確切更換條件,所以它可能無法用於你的目的。

+0

非常好的想法,這個'str_repeat'具有'preg_match_all'的返回值(不知道,實際上OP究竟想要達到什麼)。 [玩了一下](https://eval.in/522066):) –

1

使用m修飾符(多行):這將讓每行上的匹配。

嘗試使用以下正則表達式:

preg_match_all('/(\-\s\w+)/m', $str, $matches); 
print_r($matches); 
+0

很好的答案,但缺少'''。 –

+0

好,但沒有幫助。閱讀評論以瞭解OP想要做什麼。 –