8

.php変数を解析するために、サーバー上の特定のファイルからコメントを取得しようとしています。これを行う簡単な方法を見つけたと思いましたが、ファイルに明らかにコメントがあるにもかかわらず、使用する関数は何も返しません。

私が使用するコメントは次のとおりです。

/**
* @param  foo bar
* @return baz
*/

これが私のコードです:

function GetComments($filename) {

    $expr = "/((?:\/\*(?:[^*]|(?:\*+[^*\/]))*\*+\/)|(?:\/\/.*))/";

    $file = fopen($filename, "r");
    $length = filesize($filename);
    $comments = fread($file, $length);
    fclose($file);

    preg_match_all($expr, $comments, $matches);

    foreach($matches[0] as $id => $variable) {
        $comments = str_replace($variable, '', $comments);
    }

    return $comments;
}

私が間違っていることはありますか?もしそうなら、私は明らかにそれを見過ごしているからです.

どんな助けでも大歓迎です。


私は答えを見つけました:

まず第一に、プラグインを読み取るためのシステムを作成しようとしていることに、おそらく私の質問で注意すべきでした。これらのプラグイン ファイルには、プラグインの作成者、Web サイト、電子メールなどの変数を含むコメント ブロックが上部に含まれている必要があります。

だからここに私がしたことがあります:

フィーエラの例を参考にして、関数を変更してコメントとその変数を取得しました。

次に、ニーズに合わせてコードを少し変更しました。

public function GetComments($filename)
{

    $docComments = array_filter(token_get_all(file_get_contents($filename)), function($entry)
    {
        return $entry[0] == T_COMMENT;
    });
    $fileDocComment = array_shift($docComments);

    $regexp = "/\@.*\:\s.*\r/";
    preg_match_all($regexp, $fileDocComment[1], $matches);

    for($i = 0; $i < sizeof($matches[0]); $i++)
    {
        $params[$i] = split(": ", $matches[0][$i]);
    }

    return($params);
}

フィーエラがくれたコードの結果を正規表現で照合すると、パラメーターとそれらの値を組み合わせた配列が得られます。

次に、分割関数を使用して、実際に分離されたパラメーターと値を提供したので、関数を呼び出した変数にそれらを返すことができました。

これを適切に機能させるには、以前使用していたコメント スタイルを変更する必要がありました。

/**
* @param foo bar
* @return baz
*/

/*
@param: foo bar
@return: baz
*/

doc コメント ブロックではなく、通常のコメント ブロックにします。また、分割機能のパターンとして「:」を使用できるようにもなりました。

一部の人にとっては「あまり効率的ではない」かもしれません。フィーエラが指摘したように、「コメントのスタイルが変わったらどうしますか?」. このプロジェクトに取り組み、プラグインを作成するのは私だけです。したがって、すべてのプラグイン スクリプトでコメント スタイルを同じに保つことは、私にとってそれほど難しくありません。

この方法は私にとって完璧に機能します。

4

3 に答える 3

10

token_get_all()を使用できます。これは、「Zend エンジンの語彙スキャナーを使用して、指定された PHP ソース文字列を言語トークンに解析します」。

これは、現在のファイルから file-doc-comment を取得するために一度使用した関数の例です。

/**
 * Return first doc comment found in this file.
 *
 * @return string
 */
function getFileDocBlock()
{
    $docComments = array_filter(
        token_get_all( file_get_contents(__FILE__)), function($entry) {
            return $entry[0] == T_DOC_COMMENT;
        }
    );
    $fileDocComment = array_shift($docComments);
    return $fileDocComment[1];
}
于 2012-07-16T13:03:54.120 に答える
3

ReflectionClass クラスReflectionFunctionクラスを使用してみてください。

関数パラメータを取得するために必要なのはこれだけです。

于 2012-07-16T12:44:40.750 に答える