Регулярное выражение в PHP между /* и */ для preg-match

Я пытаюсь извлечь все подстроки в строке между строками /* и */. Я знаю, что это, вероятно, нужно будет сделать с помощью регулярных выражений, однако мне трудно получить правильное регулярное выражение, поскольку символ звезды фактически используется для обозначения повторяющихся символов. Я пытаюсь использовать метод preg-match в PHP, вот что я придумал до сих пор, но мне не очень повезло.

<?php
   $aString = "abcdef/*ghij*/klmn/*opqrs*/tuvwxyz";
   preg_match("/*/.*/", $aString, $anArray);

   for ($i = 0; $i < count($anArray); i++)
      echo $anArray[i] . "\n";
?>

person jazzdawg    schedule 14.08.2010    source источник
comment
Вы случайно не анализируете блоки комментариев из исходного кода PHP с помощью этого?   -  person Pekka    schedule 14.08.2010
comment
Я пытаюсь создать средство форматирования php-кода для отображения php-кода с использованием HTML.   -  person jazzdawg    schedule 14.08.2010
comment
Вы пробовали свой код, прежде чем публиковать его здесь? Существуют основные ошибки, такие как: i -> $i, о котором должен сообщать анализатор php.   -  person Martin Vseticka    schedule 14.08.2010
comment
@jazzdawg: В этом случае используйте token_get_all.   -  person Gumbo    schedule 14.08.2010


Ответы (5)


Рабочий код:

 $aString = "abcdef/*ghij*/klmn/*opqrs*/tuvwxyz";

 // SIMPLE VERSION WHERE ASTERISK MAY NOT BE IN THE COMMENT
 // \/\* is just escape sequence for /*  
 // [^\*]* - in comment may be whatever except * (asterisk)
 // \*\/ is escape sequence for */
 preg_match_all("#\/\*[^\*]*\*\/#", $aString, $anArray);

 // BETTER VERSION 
 // http://www.regular-expressions.info/refadv.html - for explanation of ?: and ?!  
 preg_match_all("#\/\*" . "((?:(?!\*\/).)*)" . "\*\/#", $aString, $anArray);


 var_dump($anArray); // easier for debugging than for-loop

Вывод для лучшей версии:

array(2) {
  [0]=>
  array(2) {
    [0]=>
    string(8) "/*ghij*/"
    [1]=>
    string(9) "/*opqrs*/"
  }
  [1]=>
  array(2) {
    [0]=>
    string(4) "ghij"
    [1]=>
    string(5) "opqrs"
  }
}
person Martin Vseticka    schedule 14.08.2010
comment
Если я поставлю звездочку где-нибудь там (например, /*gh*ij*), это не удастся - person NullUserException; 14.08.2010
comment
@NullUserException: Да, я знал об этом и добавил новую версию, которая должна работать лучше. - person Martin Vseticka; 14.08.2010
comment
Почему вы экранируете косую черту с помощью \/? - person NullUserException; 14.08.2010
comment
@NullUserException: я просто не помню, какие символы нужно экранировать. :-[ - person Martin Vseticka; 14.08.2010

Чтобы извлечь разделы комментариев из кода PHP, используйте Tokenizer.

token_get_all() проанализирует код и вернет массив элементов.

Комментарии будут представлены в виде T_COMMENT элементов.

У этого есть большое преимущество в том, что он перехватывает все возможные способы добавления комментариев в PHP-код:

/* This way, */

// This way

# and this way
person Pekka    schedule 14.08.2010
comment
Спасибо, я посмотрю на это - person jazzdawg; 14.08.2010
comment
Что еще более важно: это не даст вам ложных срабатываний, как в $str = "/* foo */"; - person Gumbo; 14.08.2010

Экранируйте *, чтобы использовать его, и круглые скобки объявления, чтобы захватить такой контент: /\*(.*)\*/, и вы должны использовать preg_match_all, чтобы найти все совпадения в вашей строке.

(и проще, чем for, используйте var_dump($anArray))

person Ugo Méda    schedule 14.08.2010

Если (как вы говорите в одном из комментариев) вы пытаетесь отобразить код PHP в HTML, на самом деле есть встроенная функция (highlight_file), который делает именно это.

Бесплатно бесплатно игнорировать, если вы используете это в качестве учебного упражнения и т. д. :-)

person John Parker    schedule 14.08.2010

Я думаю, что регулярное выражение будет простым, как

\/\*.*?\*\/

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

http://liveregex.com/WoDbk

person James R    schedule 20.11.2014