【问题标题】:Finding comments in a string在字符串中查找注释
【发布时间】:2013-08-27 12:08:32
【问题描述】:

我有一个顶部有 cmets 的文件。

例如

/**
 * Comments for file.
 *
 */

使用 PHP,我使用 file_get_contents 将文件内容读取到变量中,现在我想在注释中获取值。对于上述示例,预期结果将是

* Comments for file
*
*

这意味着我想要 /** 和 */ 中的内容。这个文件可以有多个 cmets,但我想要文件顶部的第一个。

有什么想法/帮助吗?

UPDATE:- 这是普通的文本文件。不是 PHP 文件。

【问题讨论】:

标签: php regex file comments


【解决方案1】:

您可以使用tokenizer阅读评论

$source = file_get_contents('example.php');
$tokens = token_get_all($source);

【讨论】:

  • 我之前会提到它没有 PHP 文件。是txt文件。
【解决方案2】:

为了完成 Dipesh Parmar 的好答案,举个例子:

$subject =<<<'LOD'
sdf df sdf sdf 
sdf sdf sdf sdf
<?php 
/**
* Youhou!!
*
* HiHa!
*
*/
LOD;

$tokens = token_get_all($subject);

foreach($tokens as $token) {
    if (is_array($token)&&$token[0]==T_DOC_COMMENT) {
        echo substr(substr($token[1],4),0,-3);
        break;
    }
}

注意:当且仅当主题包含 &lt;?php 时才有效,否则 cmet 被标记器视为简单文本。如果&lt;?php 缺失,您可以在主题前轻松添加:

$tokens = token_get_all('<?php'.$subject);

你可以系统地做,这个任务有两个&lt;?php不是问题。

【讨论】:

  • 对不起卡西米尔,感谢您提供的信息,但它不是 php 文件,而是 txt 文件。
  • @UmakantPatil:如果你在通知部分使用这个技巧,它就会起作用。
【解决方案3】:

如果文件是PHP类,那么你可以使用ReflectionClass::getDocCommentReflectionMethod::getDocComment

例如

$instance = new ClassWithComments();
$reflectionClass = new \ReflectionClass($instance);
echo $reflectionCLass->getDocComment();

【讨论】:

  • 抱歉不是 PHP 文件。
【解决方案4】:

标准建议是使用解析器而不是正则表达式。

但是^/\*(([^*]*[*]*[^*/])+)\*/ 应该可以解决您的问题。请记住在您的正则表达式引擎中启用多行匹配。捕获组 1 包含结果。

【讨论】:

  • 谢谢,如何在 PHP 中启用多行匹配?
  • 即使我将它与 preg_match 一起使用,它也会导致我出现错误:- 警告:preg_match(): Unknown modifier '*' in test.php on line 12
【解决方案5】:

试试/\*{2}\s(.*?)\s\*/

问候。

【讨论】:

  • 这没有得到我的结果。可能是因为换行符。我正在为此使用 preg_match。
  • 我根本不喜欢 PHP,但从我在 [stackoverflow.com/questions/8958310/… 讨论中发现的类似preg_match('#\*{2}\s(.*?)\s\*/#s',$str,$matches); 的内容可能会奏效。诀窍是结束分隔符后的 s,表示 PCRE_DOTALL,即“。”将匹配换行符。
猜你喜欢
  • 2013-08-06
  • 2011-02-04
  • 2013-10-19
  • 2019-03-20
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
相关资源
最近更新 更多