2

HTML テンプレートから変数をキャッチする小さなシステムを構築しようとしています。

@XXX@ として定義された変数は、(必須ではありませんが) コロン (:) で送信される追加のパラメーターを持つ場合があります。つまり、@XXX@:j は、データを json エンコードとして送信します。

私ができることは、変数とそれらの追加のパラメーターをキャプチャするために preg_match_all を作成することです。だから私はこのpregを思いついた:

preg_match_all("/(@.*@(?:(j|n|x|z))?)/imU", $string,$this->localVariables,PREG_PATTERN_ORDER);

j|n|x|z は、利用可能な追加パラメータです。

$string に送信する文字列は次のとおりです: @geterr@ @domain@:j @jhon@:n

preg_match_all から得た結果は次のとおりです。

Array
(
[0] => Array
    (
        [0] => @geterr@
        [1] => @domain@
        [2] => @jhon@
    )

[1] => Array
    (
        [0] => @geterr@
        [1] => @domain@
        [2] => @jhon@
    )

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

)

?: はオプションのサブパターンに使用されることを知っています (または知っていると思います) 使用される修飾子は次のとおりです。

私は何が間違っているのか他に手がかりがありません。

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

4

1 に答える 1

4

あなたのパターンにはいくつかの問題があります/(@.*@(?:(j|n|x|z))?)/imU

  1. パターン全体のキャプチャ グループは必要ありません。

  2. ?:非キャプチャ グループを作成していますが、オプションのグループに限定されません。

  3. 修飾子mは と呼ばれmultilineますが、これは少し誤解を招く可能性があり、アンカーのみに影響し、文字列だけでなく行の開始と終了にも一致します^$

    あなたが望むのは修飾子ssingleline修飾子です。文字列全体を 1 行として扱い、.改行文字にも一致するようにします。

  4. 修飾子Uにより、正規表現全体が貪欲になりません。オプションのグループにも影響し、パターンの最後にあるため一致しないため、これは望ましくありません。

  5. :文字列の を一致させる必要があります

    したがってU、最初の量指定子のみを削除して貪欲にしないよう?にします。その後に a を追加します。

だから私はあなたの正規表現は次のようになるべきだと思います:

/@(.*?)@(?::(j|n|x|z))?/is

これにより@、最初のキャプチャ グループの と 2 番目のグループのパラメータの間に最初の部分が配置されます。

ここでRegexrを参照してください

于 2012-12-12T08:12:17.013 に答える