複数のセミコロンで区切られたSQLステートメントを含む文字列を指定すると、次の関数は個々のステートメントを解析し、それらすべてを配列で返します。 1つの(重要な)正規表現と、preg_match_all()
への1つの呼び出しを使用します。 、および単一行と複数行のコメント、および単一引用符と二重引用符で囲まれた文字列を正しく処理します(それぞれに無視される非終了セミコロンが含まれる場合があります):
function split_sql($sql_text) {
// Return array of ; terminated SQL statements in $sql_text.
$re_split_sql = '%(?#!php/x re_split_sql Rev:20170816_0600)
# Match an SQL record ending with ";"
\s* # Discard leading whitespace.
( # $1: Trimmed non-empty SQL record.
(?: # Group for content alternatives.
\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\' # Either a single quoted string,
| "[^"\\\\]*(?:\\\\.[^"\\\\]*)*" # or a double quoted string,
| /\*[^*]*\*+(?:[^*/][^*]*\*+)*/ # or a multi-line comment,
| \#.* # or a # single line comment,
| --.* # or a -- single line comment,
| [^"\';#] # or one non-["\';#-]
)+ # One or more content alternatives
(?:;|$) # Record end is a ; or string end.
) # End $1: Trimmed SQL record.
%x'; // End $re_split_sql.
if (preg_match_all($re_split_sql, $sql_text, $matches)) {
return $matches[1];
}
return array();
}
2017年8月15日編集: @jxmallettによって指摘された正規表現の複数行コメント部分のエラーを修正しました。2017年8月16日編集: 正規表現を整理しました(正規表現シバンを追加し、不要なグループ$2
を削除しました 。