Помогите найти комментарии в PHP скрипте

jeka!

Просто Member
Помогите найти комментарии в PHP скрипте

Мне надо найти все комментарии в пхп скрипте, такого вида:
#
//
Трабла такая, если например в стринге встретится такая комбинация символов, то всё до конца строки будет считаться комментарием.
Как написать регу или определённую конструкцию которая будет игнорировать встреченные # и // в стрингах?
Вот примеры:

"~(#.*|//.*)(?=\r|\n)$~m"
"~((#|//)[^\n]*)~"

завалится на такой строке:

$str="<font color=\"#008000\"></font>"; $id=1;

Замучился уже экспериментировать с регами...
 

jeka!

Просто Member
Мне надо чтобы это всегда работало, не зависимо от встроенного расширения.
Я написал класс подсветки PHP кода в стиле HomeSite 5.0
Если не в курсе, то там практически самый лучший парсер подсветки синтаксиса кода, который может подсвечивать практически все составляющие:
операторы, строки, функции, пользовательские функции, разделители, переменные, числа, комментарии, константы, комманды shell в аппострофах, сепараторы, зарезервированные слова.
Всё своими цветами, а не так лажево, как делает это сам PHP.
Так вот, мой класс делает то-же самое, только трабла осталась с комментариями.
Если код правильный, и в стрингах нет символов комментариев, то подсветка удачна работает.
Может тут есть какой нето специалист по регам, который мне поможет...
 
PHP:
<?php
  // такие
  # такие
  /* привет */
  $com_slash="";
  $com_num="";
  $com_other="";
  $source = file_get_contents("somefile.php");
  $tokens = token_get_all($source);
  foreach ($tokens as $token) {
     list($id, $text) = $token;
     switch ($id) {
       case T_COMMENT:
       case T_ML_COMMENT:
       case T_DOC_COMMENT:
       if (substr($text, 0, 2)=="//"){
       	$com_slash.=$text."<br>";
       	} elseif ($text{0}=="#") {
       		$com_num.=$text."<br>";
       		}
       		else $com_other.=$text."<br>\n";
         break;
     }
   }
  echo "\n <b>Где слеш:</b><br>\n".$com_slash;
  echo "\n <b>Где решетка:</b><br>\n".$com_num;
  echo "\n <b>Остальные:</b><br>\n".$com_other;
  // такие2
  # такие2
  /* привет2 */
?>
но думаю проще, если разобраться с РВ
щас попробую через рв сделать

-~{}~ 16.04.04 16:58:

PHP:
<?
$a="# это коммент \n  // привет \n <font color=\"#008000\">привет</font>";
echo "было: ".$a."<br>";
$a=preg_replace("'#(.*?)\n'i", "<b># \\1 </b>\n", $a);
$a=preg_replace("'//(.*?)\n'i", "<b>// \\1 </b>\n", $a);
echo "стало: ".$a."<br>";
?>
вот на что меня хватило и то мне самому подсказали....
проблему не решает....
 

IntenT

SkyDiver
О! идея.
передавай все в highlight_text и вырезай все что оранжевое :))
 

korvin0

моська
PHP:
function comment_find($text) {
 $tokens = token_get_all($text);
 foreach ($tokens as $token) if ($token[0]==352) $arr[]=$token[1];
 return $arr;
}
А ларчик просто откывался... Енто функция, которая принимает строку, а возвращает массив комментариев, которые находятся во входящей строке. Ищет комментарии всех видов.
 

jeka!

Просто Member
Да я же говорю, токен работает нормально, но не всегда может быть включен, в мануале написано что эти функции включены тока в PHP 4.3.0 по умолчанию, а в ранних версиях, я более чем уверен, что их просто никто не включает.
В общем, на большенстве хостингов...

Теперь после того, как я целый день убил на поиск данного решения, и так его не нашел, решил таки заюзать токен.

на счёт highlight_text я думал в самую первую очередь, как тока собирался писать сам класс.
И отказался от этого, во первых, так не интересно...

Весьма интереснее и оригинально, было бы написать самостоятельный разборщик кода, что я собственно и сделал.

Суть там такая, поочерёдно, начиная с комментариев и заканчивая подсветкой слов находятся и кодируются в специальный не заменимый формат эти последовательности.
Что полностью исключает повторное нахождение уже ранее найденного элемента.
В результате получается очень нечитабельный текст, но потом процедурой декодирования всё вовзращается на свои места.
Если бы не 2 глюка, комментарии и сложные стринги, проблем бы небыло.

PHP файл в 5 кб, подсвечивается примерно за 0.4 сек.

Ща немного, разберусь, выложу соурсы, может что посоветуете...
 

jeka!

Просто Member
Видел, много чего видел, всё не то...
Хотя если честно, то это наверное привычка, 3 года в Home Site луписься...
 
Сверху