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