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


php regex remove inline comment only

我有一个简单的代码,看起来像这个

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

我需要正则表达式或代码来删除注释// this is default value for session,并且只删除这种类型的注释,它以一两个或更多空格开头,然后是//,然后是后面的换行符。

忽略所有其他类型的注释和事例。

更新 (1)

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

试试这个:

regex101 1

PHP Fiddle 1-点击"run"或F9查看结果

/'s+'/'/[^'n]+/m
  • 's+开始于一个或两个以上的空格
  • '/'/逃逸的//
  • [^'n]+除新行之外的任何内容

UPDATE:为了确保这只适用于代码行,我们可以使用lookbacking(2)正则表达式来检查空格[s]之前是否有分号;,注释斜杠//,因此正则表达式将为:

regex101 2

PHP Fiddle 2

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

其中(?<=;)是后备,基本上告诉引擎后备并在其匹配之前检查是否存在;


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

(1)preg_replace在全局范围内工作,不需要g标志

(2)javascript

中不支持查找

纯正则表达式的解决方案如下所示:

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