3

次の LaTeX コマンドがあります。

\autocites[][]{}[][]{}

内部のパラメーター[]はオプションで、内部の他のパラメーター{}は必須です。コマンドは、\autocites次のような追加の引数グループによって拡張できます。

\autocites[a1][a2]{a3}[b1][b2]{b3}
\autocites[a1][a2]{a3}[b1][b2]{b3}[c1][c2]{c3}
...

次のようにも使用できます。

\autocites{a}{b}
\autocites{a}[b1][]{b3}
\autocites{a}[][b2]{b3}
...

PHPで正規表現を使用してパラメータを抽出したいと思います。これは私の最初の試みです:

/\\autocites(\[(.*?)\])(\[(.*?)\])(\{(.*?)\})(\[(.*?)\])(\[(.*?)\])(\{(.*?)\})/

これ\autocitesは、3 つのパラメーターの 2 つのグループのみが含まれている場合は正常に機能しますが、不明な数のパラメーターに対して機能させる方法を理解できません。

また、次の表現を使用してみました。

/\\autocites((\[(.*?)\]\[(.*?)\])?\{(.*?)\}){2,}/

今回は、さらに多数のパラメーターに一致させることができますが、PHP は常に最後の 3 つのパラメーターの内容を提供するだけなので、すべての値を抽出することはできません。

Array
(
    [0] => Array
        (
            [0] => \autocites[a][b]{c}[d][e]{f}[a][a]{a}
        )

    [1] => Array
        (
            [0] => [a][a]{a}
        )

    [2] => Array
        (
            [0] => [a][a]
        )

    [3] => Array
        (
            [0] => a
        )

    [4] => Array
        (
            [0] => a
        )

    [5] => Array
        (
            [0] => a
        )

)

どんな助けでも大歓迎です。

4

1 に答える 1

2

これは 2 つの手順で行う必要があります。任意の量のキャプチャを取得できるのは .NET だけです。他のすべてのフレーバーでは、結果として得られるキャプチャの量は、パターン内のグループの数によって決まります (グループを繰り返すと、以前のキャプチャのみが上書きされます)。

したがって、最初に全体を照合してパラメーターを取得し、2 番目のステップでそれらを抽出します。

preg_match('/\\\\autocites((?:\{[^}]*\}|\[[^]]*\])+)/', $input, $autocite);
preg_match_all('/(?|\{([^}]*)\}|\[([^]]*)\])/', $autocite[1], $parameters);
// $parameters[1] will now be an array of all parameters

動作 デモ。

もう少し精巧なアプローチとアンカー\Gを使用すると、キャプチャの代わりに任意の量の一致を使用して、すべてを一度に実行することもできます。

preg_match_all('/
    (?|             # two alternatives whose group numbers both begin at 1
      \\\\autocites  # match the command
      (?|\{([^}]*)\}|\[([^]]*)\])
                    # and a parameter in group 1
    |               # OR
      \G            # anchor the match to the end of the last match
      (?|\{([^}]*)\}|\[([^]]*)\])
                    # and match a parameter in group 1
    )
    /x',
    $input,
    $parameters);
// again, you'll have an array of parameters in $parameters[1]

動作デモ。

このアプローチautocitesでは、コードに複数ある場合、すべてのコマンドからすべてのパラメーターを 1 つのリストで取得することに注意してください。それを軽減する方法はいくつかありますが、その場合、最初のアプローチがよりクリーンになると思います。

オプションのパラメーターと必須のパラメーターを (任意のアプローチで) 区別できるようにする場合は、パラメーターと共に開始または終了のブラケット/ブレースをキャプチャし、その文字に対してチェックして、それがどのタイプであるかを調べます。

于 2013-08-04T20:34:32.137 に答える