fork(2) download
  1. <?
  2. $text=<<< HEREDOC
  3. /* " */ insert into table t values ("\"", "--", "/*"); /* -- */
  4. DROP DATABASE; -- yes!
  5. HEREDOC;
  6.  
  7. function parse($sql) {
  8. $res=Array("comments"=> Array(), "queryes"=>Array());
  9. $RE1="\n(?P<comment>\/\*.*?\*\/)\n"; // комментарий
  10. $RE2=<<< HEREDOC
  11. (?P<quote>
  12.   " # кавычка внутри которой
  13.   (?:
  14.   (?:\\\\.)++ | # что-то экранированное или
  15.   [^"\\\\]++ | # не кавычка и не слэш
  16.   )? # или вообще ничего внутри кавычек
  17.   "
  18. )
  19.  
  20. HEREDOC;
  21. $RE3= "\n(?P<endcomment>--[^\\n]++)\n"; // комментарий до конца строки
  22.  
  23. // поместим все комменты в массив
  24. $RE4=<<< HEREDOC
  25. [^"\/-]++ | # не кавычка и не слэш и не тире
  26. $RE2 | # что-то в кавычках
  27. $RE1 | # многострочный коммент
  28. $RE3 | # однострочный
  29. [-\/] # тире или слэш (открытая кавычка подразумевает наличие закрывающей)
  30.  
  31. HEREDOC;
  32.  
  33. $RE5= <<< HEREDOC
  34. (?<query>
  35.   (?:
  36.   [^";]++ | # не кавычка и не точка с запятой
  37.   $RE2 # что-то в кавычках
  38.   )+
  39.   ;
  40. )
  41.  
  42. HEREDOC;
  43. "/$RE4/xs",
  44. function($data) use (&$res) {
  45. if ($data["comment"] || $data["endcomment"]) {
  46. $res["comments"][]=$data["comment"]?$data["comment"]:$data["endcomment"];
  47. return "";
  48. };
  49. return $data[0];
  50. },
  51. $sql);
  52. preg_match_all("/$RE5/xs", $sql, $temp);
  53. $res["queryes"]=$temp[0];
  54. return $res;
  55. };
  56.  
  57. var_dump(parse($text));
  58. ?>
Success #stdin #stdout 0.01s 20520KB
stdin
Standard input is empty
stdout
array(2) {
  ["comments"]=>
  array(3) {
    [0]=>
    string(7) "/* " */"
    [1]=>
    string(8) "/* -- */"
    [2]=>
    string(7) "-- yes!"
  }
  ["queryes"]=>
  array(2) {
    [0]=>
    string(47) " insert into table t values ("\"", "--", "/*");"
    [1]=>
    string(16) " 
DROP DATABASE;"
  }
}