2012-02-22 17 views
1

匹配子模式我有這種形式的一個正則表達式:參看preg_ *函數與量詞

/(?:^- (.*)$\r*\n*)+/m 

意圖是匹配文本的一個或多個行與-[space]啓動。

這工作正常,除了當涉及到收集匹配的子模式(.*)。只返回最後一個,並且任何先前的子模式匹配(它們出現在結果數組中作爲索引0的一部分)都會丟失。

我真的需要一些方法來獲得這些子模式在一個數組中,所以我可以將它們傳遞給implode並做我正在嘗試做的事情。

我在這裏錯過了一些明顯的東西嗎?

+2

你能否告訴我們輸入的字符串的一些例子嗎? – Toto 2012-02-22 15:40:50

回答

2

也許你可以使用

preg_match_all('/^- (.*)\r\n/m', $subject, $result, PREG_PATTERN_ORDER); 
var_dump($result); 

例如:

<?php 
$subject = "- some line 
- some content 
- some other content 
nothing to match over here 
- more things here 
- more patterns 
nothing to match here 
"; 

preg_match_all('/^- (.*)\r\n/m', $subject, $result, PREG_PATTERN_ORDER); 
var_dump($result); 
?> 

結果:

array(2) { 
    [0]=> 
    array(5) { 
    [0]=> 
    string(12) "- some line 
" 
    [1]=> 
    string(15) "- some content 
" 
    [2]=> 
    string(21) "- some other content 
" 
    [3]=> 
    string(19) "- more things here 
" 
    [4]=> 
    string(16) "- more patterns 
" 
    } 
    [1]=> 
    array(5) { 
    [0]=> 
    string(9) "some line" 
    [1]=> 
    string(12) "some content" 
    [2]=> 
    string(18) "some other content" 
    [3]=> 
    string(16) "more things here" 
    [4]=> 
    string(13) "more patterns" 
    } 
} 
+0

似乎是一個開始的好地方,但那我會怎麼做一個'preg_replace'呢? – 2012-02-22 15:44:08

+0

我不確定我是否理解。要從最初的'$ subject' var創建一個正則表達式模式,我會做'$ someVar ='/'。implode('|',$ result [1])。'/';'然後使用'$ someOtherVar = preg_replace ($ someVar,$ someReplacement,$ textVar);'(我編輯了一些正則表達式,忽略了'\ r \ n')。如果我誤解了,我很抱歉。 – 2012-02-22 16:05:55