【问题标题】:Get comments in a php file获取 php 文件中的注释
【发布时间】:2012-07-15 07:32:47
【问题描述】:

我一直试图从我服务器上的某个 .php 文件中取出 cmets,以便解析它的变量。我以为我找到了一个简单的方法来做到这一点,然而,我使用的函数没有返回任何内容,即使我在文件中显然有 cmets。

这是我使用的 cmets:

/**
* @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;
}

我做错了什么吗?因为如果是这样,我显然是在看它。

非常欢迎任何帮助。

编辑:

我找到了答案:

首先,我可能应该在我的问题中指出我正在尝试编写一个用于读取插件的系统。这些插件文件应在顶部包含一个注释块,其中包含插件的作者、网站、电子邮件等变量。

这就是我所做的:

我以feeela 的例子来改变我的函数来获取cmets 和它的变量。
然后我稍微更改了它的代码以满足我的需要:

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);
}

我把feeela给我的代码结果通过正则表达式匹配,得到一个包含参数及其值组合的数组。
然后我使用 split 函数实际上给了我单独的参数和值,所以我可以将它们返回给调用该函数的变量。

为了让它正常工作,我需要更改我使用的评论样式

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

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

使其成为普通的注释块,而不是文档注释块。
它还使我能够使用 ':' 作为拆分功能的模式。

在某些人看来,它可能“效率不高”。正如feeela 所说,“如果您的评论风格发生变化怎么办?”。我将是唯一一个在这个项目上工作并编写插件的人。因此,在每个插件脚本中保持相同的注释样式对我来说也不会太难。
这种方法对我来说非常有效。

感谢大家对此的帮助。

【问题讨论】:

  • 当你做 print_r($matches); 它打印什么??
  • 您不能使用正则表达式来可靠地完成此操作。
  • 不要介意我的参数前面的反斜杠,因为我需要把它们放在那里,因为我认为我在这个评论中通知了某人:Array ( [0] => Array ( [0] => /** * \@param foo bar * \@return baz / ) [1] => 数组 ( [0] => /* * \@param foo bar * \@return baz */ ) )

标签: php parsing comments


【解决方案1】:

看看Comment Manager。它是一组用于解析 DocBloc cmets 的 Php 类。它还允许根据 DocBlock cmets 中的信息验证函数参数值

【讨论】:

    【解决方案2】:

    您可以使用token_get_all(),它“使用 Zend 引擎的词法扫描器将给定的 PHP 源字符串解析为语言标记”。

    见:http://php.net/token_get_all

    这是我曾经用来从当前文件中获取文件文档注释的示例函数:

    /**
     * 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];
    }
    

    【讨论】:

    • 好的,谢谢。这让我得到了我在文件中使用的实际 cmets 块(当我将 'FILE' 更改为我想要的文件名时)。所以现在我想我必须使用一些正则表达式来提取变量。
    • @Gabi Barrientos 您应该在问题中定义您想要实现的目标,而不是进行一些疯狂的解析。可能有更简单的方法来获取您想要检索的信息。此外,请尝试 token_get_all()-function 而不过滤其输出以查看包含哪些其他信息。例如,如果您想获取函数参数 - 它们在从 token_get_all() 返回的数组中具有自己的值。
    【解决方案3】:

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 2020-12-30
    相关资源
    最近更新 更多