Как убрать исполняемые комментарии MySQL с помощью regexp - PullRequest
2 голосов
/ 13 января 2012

Мне нужно получить содержимое исполняемых комментариев в результатах mysqldump, но для регулярных выражений

/\/\*\!\d+\s+(.*?)\*\//s

и таких входных данных:

/*!50003 text
some text else
/*
comment
also comment
*/
text...
and also text...
*/

Я получаю неправильный результат, потому что он получает данныетолько от "текста" до "также комментировать" строки.Как я могу пропустить комментарий в комментарий?Спасибо.

UPD : я не могу использовать «^» и «$», чтобы пометить начало и конец ввода, потому что у меня много выполняемых операторов на входе.

UPD2 : вывод, который я хочу:

text
some text else
/*
comment
also comment
*/
text...
and also text...

НЕ все вводить, как в комментарии ниже.Это очень странно, я думаю, получить тот же вывод, что и для ввода.

UPD3 : начало исполняемого комментария должно быть / *! ANYNUMBER.Он должен быть пропущен и не включен в вывод.Конец исполняемого комментария - просто * / Пример правого вывода представлен в «UPD2».

Ответы [ 2 ]

3 голосов
/ 13 января 2012

Чистые регулярные выражения не могут обрабатывать вложения, но PHP-стиль может использовать recursion .Используя модификатор PCRE_EXTENDED , мы можем получить пробел и комментарии:

%(               # opening RE delimiter, group start
  /\*            # comment open marker
    (  [^/*]     # non comment-marker characters
     | /(?!\*)   # '/' not followed by '*', so not a comment open
     | \*(?!/)   # '*' not followed by '/', so not a comment close
     | (?R)      # recursive case
    )*           # repeat any number of times
  \*/            # comment close marker
)%x              # group end, closing RE delimiter, PCRE_EXTENDED

Короче говоря:

%(/\*([^/*]|/(?!\*)|\*(?!/)|(?R))*\*/)%x

Используется:

<?php

$commentRE = '%(/\*([^/*]|/(?!\*)|\*(?!/)|(?1))*\*/)%';
$doc = <<<EOS

USE database;

/* comment
and a
/* nested comment /* me too */
   now exiting
 */
the comment */


/*!50003 text
some text else
/*
comment
also comment
*/
text...
and also text...
*/

CREATE TABLE IF NOT EXISTS ...

EOS;

preg_match_all($commentRE, $doc, $parts);
var_export($parts[0]);

Результат:

array (
  0 => '/* comment
  and a
  /* nested comment /* me too */
     now exiting
   */
  the comment */',
  1 => '/*!50003 text
  some text else
  /*
    comment
    also comment
  */
  text...
  and also text...
*/',
)
1 голос
/ 11 декабря 2012

Основываясь на этом отличном решении, я сделал регулярное выражение PHP, чтобы удалить все типы комментариев (и только комментарии, а не текст в кавычках, похожий на комментарии;): регулярное выражение в соответствии с комментариями MySQL

...