我有一个简单的代码,看起来像这个
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;
}