转换单行注释来阻止评论(Convert Single Line Comments To Block

2019-08-17 04:04发布

我需要转换单行注释(//...)以块注释(/*...*/) 我已经近在下面的代码来实现这一点; 但是,我需要的功能来跳过任何单行注释已经处于块注释。 目前,它匹配任何单行注释,即使在单行注释是一个注释块。

 ## Convert Single Line Comment to Block Comments
 function singleLineComments( &$output ) {
  $output = preg_replace_callback('#//(.*)#m',
   create_function(
     '$match',
     'return "/* " . trim(mb_substr($match[1], 0)) . " */";'
   ), $output
  );
 }

Answer 1:

前面已经提到,“ //... ”能块注释和字符串内发生。 所以,如果你创建一个小的“解析”与正则表达式,挂羊头卖狗肉的援助FA位,你可以先匹配任何一种的那些事(字符串文字或块注释),之后,测试,如果“ //... ”是当下。

这里有一个小的演示:

$code ='A
B
// okay!
/*
C
D
// ignore me E F G
H
*/
I
// yes!
K
L = "foo // bar // string";
done // one more!';

$regex = '@
  ("(?:\\.|[^\r\n\\"])*+")  # group 1: matches double quoted string literals
  |
  (/\*[\s\S]*?\*/)          # group 2: matches multi-line comment blocks
  |
  (//[^\r\n]*+)             # group 3: matches single line comments
@x';

preg_match_all($regex, $code, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE);

foreach($matches as $m) {
  if(isset($m[3])) {
    echo "replace the string '{$m[3][0]}' starting at offset: {$m[3][1]}\n";
  }
}

这将产生以下的输出:

replace the string '// okay!' starting at offset: 6
replace the string '// yes!' starting at offset: 56
replace the string '// one more!' starting at offset: 102

当然,也有可能更多的字符串字面量在PHP,但你明白我的意思吧,我想。

HTH。



Answer 2:

你可以尝试一下负背后: http://www.regular-expressions.info/lookaround.html

## Convert Single Line Comment to Block Comments
function sinlgeLineComments( &$output ) {
  $output = preg_replace_callback('#^((?:(?!/\*).)*?)//(.*)#m',
  create_function(
    '$match',
    'return "/* " . trim(mb_substr($match[1], 0)) . " */";'
  ), $output
 );
}

但我担心,在他们//可能的字符串。 像:$ X = “一些字符串//用斜杠”; 会得到转换。

如果源文件是PHP,你可以用分词来解析该文件以更高的精度。

http://php.net/manual/en/tokenizer.examples.php

编辑:忘了固定长度,您可以通过嵌套表达克服。 以上应该现在的工作。 我测试了它:

$foo = "// this is foo";
sinlgeLineComments($foo);
echo $foo . "\n";

$foo2 = "/* something // this is foo2 */";
sinlgeLineComments($foo2);
echo $foo2 . "\n";

$foo3 = "the quick brown fox";
sinlgeLineComments($foo3);
echo $foo3. "\n";;


文章来源: Convert Single Line Comments To Block Comments