2011-08-03 7 views
2

私は文字列を通過し、すべての要素を! - と - !の間で処理します。しかし、ユニークな要素だけがプロセスです。私が持っているとき - 例 - !そしてさらにテキストの中に - !example--!と書いてありますが、2番目のものは無視されます。preg_matchは同じ要素を一度だけ返します

これはコードです:

while ($do = preg_match("/!--(.*?)--!/", $formtext, $matches)){ 

は私がpreg_match_allについて知っているが、するpreg_matchでこれを行う必要があります。

助けが必要ですか?前もって感謝します!

+1

Pray tell:なぜ 'preg_match_all'を使用できないのですか?私には奇妙な要求があるようです。 – Wrikken

答えて

4

の前に一致するものが見つかったら、となります。そのためには、PREG_OFFSET_CAPTUREフラグを使用して文字列オフセットを取得する必要があります。

例:

$offset = 0; 
while (preg_match("/!--(.*?)--!/", $formtext, $match, PREG_OFFSET_CAPTURE, $offset)) 
{ 
    // calculate next offset 
    $offset = $match[0][1] + strlen($match[0][0]); 

    // the parenthesis text is accessed like this: 
    $paren = $match[1][0]; 
} 

は、詳細はpreg_matchマニュアルを参照してください。

+0

はい、これはトリックでした!どうもありがとう! – Bert

3

使用preg_match_all

編集:いくつかの明確化の収量:

$string = '!--example--! asdasd !--example--!'; 
//either this: 
$array = preg_split("/!--(.*?)--!/",$string,-1,PREG_SPLIT_DELIM_CAPTURE); 
var_dump($array); 
array(5) { 
    [0]=> 
    string(0) "" 
    [1]=> 
    string(7) "example" 
    [2]=> 
    string(10) " asdasd " 
    [3]=> 
    string(7) "example" 
    [4]=> 
    string(0) "" 
} 

//or this: 
$array = preg_split("/(!--(.*?)--!)/",$string,-1,PREG_SPLIT_DELIM_CAPTURE); 
var_dump($array); 

array(7) { 
    [0]=> 
    string(0) "" 
    [1]=> 
    string(13) "!--example--!" 
    [2]=> 
    string(7) "example" 
    [3]=> 
    string(10) " asdasd " 
    [4]=> 
    string(13) "!--example--!" 
    [5]=> 
    string(7) "example" 
    [6]=> 
    string(0) "" 
} 
+0

私はまた、一致の間にテキストをキャッチする必要があるので、私はpreg_matchとwhile文を使用することしかできないと思います。私はチェックすることができます! - それが始まりでない場合は、その前にテキストをキャッチします。 – Bert

+0

次に、デリミタキャプチャで 'preg_split'を実行します... – Wrikken

+0

ありがとうございました、オフセットとpreg_matchで取得できました。いずれの方法が速いのかわからない、どちらも動作します。 – Bert

0

while ($do = preg_match("/[!--(.*?)--!]*/", $formtext, $matches)){

1以上を指定するには、パターンの最後に*を指定します。両方とも、$ matches配列に追加する必要があります。

+0

これは無限ループにつながります...ページを読み込めません。 – Bert

関連する問題