Как уже упоминалось, "//...
" может встречаться внутри блочных комментариев и строковых литералов. Поэтому, если вы создадите небольшой «парсер» с помощью бита regex-trickery, вы можете сначала сопоставить любую из этих вещей (строковые литералы или блочные комментарии), а затем проверить, присутствует ли «//...
».
Вот небольшая демонстрация:
$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 возможны и другие строковые литералы, но я полагаю, что вы меня поняли.
НТН.