我需要将单行评论(//...)
转换为阻止评论(/*...*/)
。我在下面的代码中几乎完成了这个;但是,我需要函数来跳过任何单行注释已经在块注释中。目前,它匹配任何单行注释,即使单行注释位于块注释中。
## 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
);
}
答案 0 :(得分:3)
如前所述,“//...
”可以出现在块注释和字符串文字中。因此,如果您使用regex-trickery的辅助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。
答案 1 :(得分:1)
你可以尝试一下负面看: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 =“some string // with slashes”; 会被转换。
如果源文件是PHP,则可以使用tokenizer以更高的精度解析文件。
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";;