php正则表达式只删除内联注释

时间:2016-01-09 04:28:52

标签: php regex

我有简单的代码看起来像这样

function session(){
   return 1; // this default value for session
}

我需要使用正则表达式或代码来删除评论// this is default value for session,并且只删除此类评论,该评论以一两个或更多的空格开头,然后是//,然后是新行。< / p>

忽略所有其他类型的评论和案例。

2 个答案:

答案 0 :(得分:1)

更新 (1)

  

只删除这种类型的注释,它以一个或两个或更多的空格开头,然后是//,然后是一个新行

试试这个:

regex101 1

PHP Fiddle 1 - 点击&#34;运行&#34;或F9查看结果

/\s+\/\/[^\n]+/m
  • \s+ 以空格或两个或更多
  • 开头
  • \/\/ 转发的//
  • [^\n]+ 除新行外的所有内容

更新以确保 - 有点 - 这只适用于代码行,我们可以使用lookbehind (2)< / sup> regex检查空格[s]之前是否有分号;,注释斜杠//,所以正则表达式是这样的:

regex101 2

PHP Fiddle 2

/(?<=;)\s+\/\/[^\n]+/m

其中(?<=;)是lookbehind,它基本上告诉引擎向后看并检查它是否在;之前匹配。


----------------------------------------------- ------------------------

(1) preg_replace 全局工作,无需 g 标志< / em>的

(2) javascript中不支持lookbehind

答案 1 :(得分:0)

纯粹的正则表达式解决方案看起来像这样:

$result = preg_replace('#^(.*?)\s+//.*$#m', '\1', $source);

但这仍然是错误的,因为你可能被这样的东西困住:

$str = "This is a string // that has a comment inside";

更强大的解决方案是使用token_get_all()完全重写php代码,以实际将PHP代码解析为令牌,然后在重新发出代码时可以选择性地删除它们:

foreach(token_get_all($source) as $token)
{
    if(is_array($token))
    {
        if($token[0] != T_COMMENT || substr($token[1] != '//', 0, 3))
            echo $token[1];
    }
    else
        echo $token;
}