私は preg_match を使用して、評価済みの base64 でエンコードされたウイルスをファイル内で見つけて削除しています。
以下の正規表現:
/\s*eval\s*\(\s*base64_decode\s*\(\s*('[a-zA-Z0-9\+\/]*={0,2}'|"[a-zA-Z0-9\+\/]*={0,2}")\s*\)\s*\s*\)\s*(;)?\s*/
次のコードに一致します。
eval(base64_decode("BASE64+ENCODED+VIRUS+HERE"));
上記の正規表現は正常に機能します。
連結によってワードラップされたbase64文字列と一致させたかったのです。したがって、次の "BASE64+EN" にも一致するはずです。「コード + ウイルス + ここ」。
そこで、正規表現を次のように変更しました。
/\s*eval\s*\(\s*base64_decode\s*\(\s*\'([a-zA-Z0-9\+\/]*(\'\s*\.\s*\')?[a-zA-Z0-9\+\/]*)*={0,2}\'|"([a-zA-Z0-9\+\/]*("\s*\.\s*")?[a-zA-Z0-9\+\/]*)*={0,2}"\s*\)\s*\s*\)\s*(;)?\s*/
次の部分一致を検索します。
"BASE64+ENCODED+VIRUS+HERE"));
しかし、このファイル全体に一致を適用しようとすると: http://pastebin.com/ED8sFUP0ブラウザのメッセージ「ページの読み込み中にサーバーへの接続がリセットされました。」でページが停止します。
エラー報告を有効にしています:
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('scream.enabled', TRUE);
しかし、ここにもApacheのエラーログにも何も表示されません。
問題のある文字列を含まないファイルで使用された場合、まったく同じ正規表現が期待どおりに機能します。preg_match は boolean false を返しません。0 を返します。これは、正規表現エラーがなく、一致が見つからなかったことを意味します。
私の懸念は、正規表現が部分的な一致しか見つけられない理由であるとは限りません。それはおそらく私が作ったタイプミスで、たまたまうまくいきました。
正規表現コンパイラがいつ、どのようにプロセス チェーン全体を壊してしまうのか知りたい
apache > php > regex_compiler
私の正規表現がたまたま正しくコンパイルされたが、正しく一致しなかったことが「原因」である可能性が非常に高いことを理解しています。そして、それは将来的に何か悪いことを引き起こす可能性があります。しかし、私の興味は、正規表現コンパイラがエラーなしで失敗する理由と、生成されるはずのエラー メッセージを取得する方法です。
同様のことが議論されていますが、ここでは解決されていません: php preg_match_all kills page for unknown reason