2

問題は次のとおりです。次のような文字列が与えられます

"<p>The price for vehicles {capitalize(pluralize(vehicle))} is {format_number(value, language)}</p><span>{employee_name}</span><span>\{do not parse me}</span>"

(1) エスケープされていない中かっこのペア間のすべての値に一致する PHP の正規表現パターンと、(2) 関数呼び出しとネストされた関数呼び出しに一致する別の正規表現パターン(最初のパターンが一致したら) が必要です。もちろん、1 つの正規表現を両方のタスクにのみ使用できれば、すばらしいことです。

ところで、私は Smarty、Twig、またはその他のライブラリを使用できません。これが、解析メカニズムを自分で構築しなければならない唯一の理由です。

ありがとうございます!

解決策 (1) 最初の問題の部分的な解決策は、ここにあります。基本的に、正規表現を使用します

(?={((?:[^{}]++|{(?1)})++)})
結果の配列のインデックス 1 で一致を見つけます。

ただし、エスケープされた中括弧を無視する方法を見つける必要があるため、部分的です。

(2) Mario が提案したように、再帰的な正規表現の使用を検討しています。ここに結果を投稿します。

みんなありがとう!

4

1 に答える 1

1

この質問を「未回答」フィルターから削除するために、コメントから回答をコピーします。

これはあなたが探しているもののようです:

(?<!\\){([^(){}]+)\(((?:[^(){}]+|\(((?2))\))*)\)}

リンク: http://www.regex101.com/r/uI4qN0

~ジェリーごとの答え

(?<!\\)注: 比較のために、次のように、式の先頭に否定先読みを追加することで、エスケープされた波括弧を単純に無視できます。

(?<!\\)(?={((?:[^{}]++|{(?1)})++)})
于 2013-10-11T06:17:37.833 に答える