Regex в PHP между / * & * / для preg-match - PullRequest
2 голосов
/ 14 августа 2010

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

Ответы [ 6 ]

1 голос
/ 14 августа 2010

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

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

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

Это имеет большое преимущество, позволяя отлавливать все возможные способы добавления комментариев в коде PHP:

/* This way, */

// This way

# and this way
0 голосов
/ 20 ноября 2014

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

\/\*.*?\*\/

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

http://liveregex.com/WoDbk

0 голосов
/ 14 августа 2010

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

0 голосов
/ 14 августа 2010
$aString = "abcdef/*ghij*/klmn/*opqrs*/tuvwxyz";
preg_match_all("/\/\*(.*?)\*\//", $aString, $anArray,PREG_SET_ORDER);
var_dump($anArray);
0 голосов
/ 14 августа 2010

Рабочий код:

 $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"
  }
}
0 голосов
/ 14 августа 2010

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

(и проще, чемдля использования var_dump($anArray))

...