フォームにPHP関数を入力し、POSTした後、実際にPHPで実行する、という練習プログラムを作っています。
(これは安全性に問題がありそうであるため、公開するものではありません。ただ、関数名はホワイトリスト化しています。)
質問内容としましては、
「PHP関数をフォームからPOSTし、その内容をパースしたい。
そのため、function()の括弧内をカンマ区切りで抜き出したいが、
シングルクォート、ダブルクォートで区切られた文字列の中にあるカンマは無視する方法を知りたい」
というものです。
例えば下記のような関数があったとします。
function(text,int1,int2);
この関数が例えば下記のような文字列として渡されたと考え、PHPで処理するのと同じように正規表現でパースできないかと考えています。
function('a,b,c',1,2);
しかし、textの中にカンマがある場合、このままでは意図しない形でパースされてしまいます。
PHPでは、この文字列を表すtextを、"text"や'text'と、囲い文字で囲います。
囲って入れば、中にカンマがあったとしても、textの中のものとして扱われます。
そこで、textを抜き出す前提として、
0. textがシングルクォート、またはダブルクォートで囲まれている('text'や"text")場合は、textの中にカンマが含まれていてもマッチする。
0. textがシングルクォート、ダブルクォートにで囲まれていない場合は、カンマが含まれていない場合だけマッチする
このすべてを満たす正規表現を作ってみたいのですがなかなかうまくできません。
1のtextを表す正規表現としては、
'(.*)'|"(.*)"
と書くとマッチさせることはできます。
しかし、
2の「シングルクォート、ダブルクォートで囲まれていない場合はカンマの無い時だけマッチする」という書き方がうまくできません。
(?!.*,)(.*)
こちらをOR条件として入れても、マッチしないのです。
上記の1と2を同時に満たす正規表現を用いつつ、カンマ区切りが出来る方法を模索しています。
ご助言いただけますとうれしいです。