4

サブパターンで使用preg_matchすると、常に同一のデータを持つダブルキー配列が返されます。1つはサブパターン名で、もう1つは番号でタグ付けされています。1行あたり数キロバイトの数十万行を照合しているため、数値配列が余分なメモリを占有しているのではないかと心配しています。番号タグ配列が戻らないようにする適切な方法はありますか?

例:

<?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>.*?)$@m', $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.
        )

)
4

1 に答える 1

3

php.net-サブパターンから

構文を使用してサブパターンに名前を付けることができます(?P<name>pattern)。このサブパターンは、通常の数値位置と名前によって、matches 配列内でインデックス付けされます。

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

したがって、このデータを 2 回必要としない場合、唯一の可能性は、名前付きグループを使用しないことだと思います。

これは本当に問題ですか?IMO は、この追加のメモリ使用量のために、問題が発生した場合にのみこれを最適化します! 読みやすさの向上は、記憶に値するはずです。

アップデート

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

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

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

于 2012-04-27T07:52:07.633 に答える