fork download
  1. <?
  2. $text= file_get_contents("php://stdin");
  3. $RE = <<< HEREDOC
  4.   # строка
  5.   "(?:
  6.   \\\\. |
  7.   [^"]
  8.   )*+"
  9.   |
  10.   # однострочный комментарий
  11.   \/\/
  12.   (?P>TextChunk)
  13.   | # многострочный комментарий
  14.   \/\\*
  15.   .*?
  16.   \\*\/
  17.   |
  18.   (?P<define>
  19.   (?<=\\n|^) # начало строки или текста
  20.   (?P<probel>
  21.   (?:
  22.   [ \\t] | # пробелы, табуляция или
  23.   \\\\ # обратный слэш, за ним
  24.   \\r? # возможно \r
  25.   \\n # и \n
  26.   )*+
  27.   )
  28.   [#]
  29.   (?P>probel) # хоть такая ссылка и называется рекурсивной, рекурсии фактически нет
  30.   define(?=[^a-z0-9_]|\$) # define справа от которого не символ или конец строки
  31.   # грамматика требует уточнения
  32.   (?P<TextChunk>
  33.   (?:
  34.   \\\\[^\\r\\n] | # что-то экранированное, но не переводы строк, или
  35.   \\\\\\r?\\n | # экранированный перевод строки, или
  36.   [^\\r\\n] # любой символ кроме перевода строки
  37.   )*+
  38.   )
  39.   (?:\\r?\\n|\$) # конец строки или текста
  40.   )
  41.  
  42. HEREDOC;
  43.  
  44. $clb=function($match) {
  45. if (@$match["define"]) {
  46. return "<span style='color:white;background-color:blue'>".$match[0]."</span>";
  47. } else {
  48. return $match[0];
  49. };
  50. };
  51. echo preg_replace_callback("/$RE/xus", $clb, $text);
  52.  
  53. ?>
Success #stdin #stdout 0.01s 20520KB
stdin
string asd="\
#define sadf";
 
sfs // \
        # define ewifgyu
     sdf /*
      #define df
        asd
        */ \
        \
    #       \
           define sdf\
        dsfdsf\
        sdfsdf\\
   sdf #define
        #define
stdout
string asd="\
#define sadf";
 
sfs // \
        # define ewifgyu
     sdf /*
      #define df
        asd
        */ \
<span style='color:white;background-color:blue'>        \
    #       \
           define sdf\
        dsfdsf\
        sdfsdf\\
</span>   sdf #define
<span style='color:white;background-color:blue'>        #define</span>