Преобразование однострочных комментариев в блочные комментарии - PullRequest
6 голосов
/ 02 октября 2009

Мне нужно преобразовать однострочные комментарии (//...), чтобы заблокировать комментарии (/*...*/). Я почти достиг этого в следующем коде; тем не менее, мне нужна функция, чтобы пропустить любой однострочный комментарий уже в блочном комментарии. В настоящее время он соответствует любому однострочному комментарию, даже если однострочный комментарий находится в блочном комментарии.

 ## 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
  );
 }

Ответы [ 2 ]

3 голосов
/ 02 октября 2009

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

НТН.

1 голос
/ 02 октября 2009

Вы можете попробовать отрицательный взгляд: 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

Edit: Забыл про фиксированную длину, которую можно преодолеть, вложив выражение. Выше должно работать сейчас. Я проверил это с:

$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";;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...