人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

phpの構文チェックに関する質問です。
evalを使って文字列を式として評価して実行したいと考えていますが、文字列がphpとして構文エラーにならないか、evalで実行する前に調べてから実行したいと考えているのですが、チェック用の関数などが見当たりません。
何か構文チェク用の関数があればお教えいただけますでしょうか。もしくは、それに変わる手法が何かあればお教えいただけますでしょうか。
以上、よろしくお願いいたします。

●質問者: n_maco2
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● HowAreYou
●25ポイント

eval ですいませんが。

<?php
$r = @eval('invalid code') ;
echo $r === FALSE ? 'パースエラー' : 'Ok.' ;


http://www.php.net/manual/ja/function.eval.php


n_maco2さんのコメント
回答ありがとうございます。 ですがこのコードだと、問題ないコードの場合は、evalが実行されてしまいますよね。中途半端に実行されるのを防ぎたいという意図なので、これだと目的を達成できないかなと・・(もちろんERRORなら中途半端にも実行されることはありませんが、Warningなら実行されてしまうと思います)

2 ● JULY
●34ポイント

php コマンドを呼び出す事が許されるのであれば、-l もしくは --syntax-check で確認できます。

PHP: オプション - Manual

$ php -l test.php
No syntax errors detected in test.php

Web アプリケーションの機能として実装するのであれば、system() 関数を使って、引数でもらえる終了ステータスが 0 であれば OK、といった判断が出来ると思います。

PHP: system - Manual


n_maco2さんのコメント
なるほど、ありがとうございます。 しかし、この方法だとsafemodeとか別の問題を起こしてしまいそうな気がしますので、ちょっと面倒な気がしますね。 でもありがとうございます、検討させていただきます。

3 ● kodairabase
●50ポイント ベストアンサー

PECLが利用できれば、runkit_lint関数で構文チェックができます。
http://php.net/manual/ja/function.runkit-lint.php


素のままのPHPなら、以下のようにしてできます。

<?php
$MyErrorNo = 0;
function myErrorHandler($errno, $errmsg, $filename, $linenum, $vars) {
 global $MyErrorNo;
 $MyErrorNo = $errno;
 echo "$errmsg ($errno) occured.";
}

// $strを評価する
// エラーがあればエラー番号を返す。エラーが無ければ0。
function my_lint($str) {
 global $MyErrorNo;
 set_error_handler('myErrorHandler');
 error_reporting(E_ALL);
 @eval($str);
 restore_error_handler();
 return $MyErrorNo;
}

//メインプログラム
$str = '$x = 8 / 0;';
my_lint($str);
?>

n_maco2さんのコメント
この関数が使えれば一番楽ですね、ありがとうございます。 ただ、ご記載いただいたPHPのコードのほうは、これはやはり$strを実行してしまいませんか?できれば実行前に確認したいと考えています。 諸々ご回答ありがとうございました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ