Đưa ra một chuỗi chứa nhiều câu lệnh SQL được phân tách bằng dấu chấm phẩy, hàm sau sẽ phân tích cú pháp từng câu lệnh riêng lẻ và trả về tất cả chúng trong một mảng. Nó sử dụng một regex (không tầm thường) và một lệnh gọi tới preg_match_all()
và xử lý chính xác các nhận xét đơn và nhiều dòng cũng như các chuỗi được trích dẫn đơn và kép, (mỗi chuỗi có thể chứa dấu chấm phẩy không kết thúc sẽ bị bỏ qua):
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();
}
Chỉnh sửa ngày 8 tháng 8 năm 2017: Đã sửa lỗi trong phần nhận xét nhiều dòng của regex được chỉ ra bởi @jxmallett. Chỉnh sửa 2017-08-16: Tidied regex (đã thêm regex shebang và xóa nhóm không cần thiết $2
).