2012-04-27 5 views
4

preg_matchとサブパターンを使用すると、常に同じデータ(サブパターン名とタグ付きタグ付き)を持つダブルキー配列が返されます。私は1行あたり数キロバイトの行を照合しているので、数字配列が余分なメモリを占有しているのではないかと思います。番号タグ配列を返さないようにする適切な方法はありますか?番号付き配列を持たないPHPサブパターン

例:

<?php 

header('Content-Type: text/plain'); 

$data = <<<START 
I go to school. 
He goes to funeral. 
START; 
preg_match_all('@^(?<who>.*?) go(es)* to (?<place>.*?)[email protected]', $data, $matches); 
print_r($matches); 

?> 

出力:

Array 
(
    [0] => Array 
     (
      [0] => I go to school. 
      [1] => He goes to funeral. 
     ) 

    [who] => Array 
     (
      [0] => I 
      [1] => He 
     ) 

    [1] => Array 
     (
      [0] => I 
      [1] => He 
     ) 

    [2] => Array 
     (
      [0] => 
      [1] => es 
     ) 

    [place] => Array 
     (
      [0] => school. 
      [1] => funeral. 
     ) 

    [3] => Array 
     (
      [0] => school. 
      [1] => funeral. 
     ) 

) 
+0

コード例を示してください。 – deceze

+0

入力と出力の例が役に立ちます。 – Jack

+0

は、私の質問を理解していない人のサンプル入力と出力を編集しました。 –

答えて

3

php.net- Subpatterns

から、構文(?P<name>pattern)を使用してサブパターンに名前を付けることが可能です。このサブパターンは、matches配列内の通常の数値位置と名前によっても索引付けされます。

インデックスのみを名前で指定するオプションはありません。

このデータを2回欲しくない場合は、名前付きグループを使用しないでください。

これは本当に問題ですか? IMOは、この追加のメモリ使用量のために問題に遭遇した場合にのみ、これを最適化します。 改善された可読性は、メモリの価値があるはずです!

更新

のみ、オプションの "ES" に一致する必要がありますそれはgo(es)*のように見えます。ここでは、非キャプチャグループを使用してメモリを節約できます。

preg_match_all('@^(?<who>.*?) go(?:es)? to (?<place>.*?)[email protected]', $data, $matches); 

?:でグループを開始すると、一致するコンテンツは保存されません。私はまた、0以上を意味する*を置き換えました。また、0または1を意味する?の "goeseses"にも一致します。

+0

ありがとう!後者(非キャプテングループ)は本当に主な問題に関連していませんが、私には新しいものです。再度、感謝します! :) –

関連する問題