警告:preg_match():内部pcre_fullinfo()
質問
次の作業コードがあります。
$test = '123456';
$int = preg_match('/^\d+$/', $test, $matches);
print_r(array($int, $matches));
しかし、私 CodePadで実行します エラーが発生します:
警告:preg_match():内部pcre_fullinfo()エラー-3行5のエラー
しかし、コードは自分のマシンで実行されています(そして、コードはIMHOである必要があります)。
将来的にコードを配布する必要があります。そうすれば、構成に応じて壊れる場合は悪いでしょう。それで、コードパッドがそれに壊れる理由は何ですか?
解決
CodePadを介して実行されたコードは、非常に制限された環境で実行されています。
コード実行は、Geordiに基づいた監督者によって処理されます。戦略は次のとおりです Ptraceの下ですべてを実行し、多くのシステム呼び出しが許可または無視されています. 。コンパイラと最終実行可能ファイルはどちらもChroot刑務所で実行され、厳格なリソース制限があります。監督者はHaskellで書かれています。
Regexエンジンを壊すことは期待していませんが、PCREライブラリがCodePad環境によってブロックされるものを内部的に使用する可能性が非常に高いです。生産システムはこのような厳しい制限を使用しないため、アプリケーションでそのコードを使用することは安全です。
エラーコードは「pcre_error_badoption -の値」を表します 何 しかし、エラーが発生するPHPソースのコードはです。 rc = pcre_fullinfo(pce->re, extra, PCRE_INFO_CAPTURECOUNT, &num_subpats);
の定数を使用します 何. 。したがって、それは明らかに、PCREライブラリがCodePadで壊れていることを意味します。
完全に安全にしたい場合は、libpcreを使用して小さなCプログラムを作成して、同じ正規表現でその関数を呼び出すことができます。