एकाधिक, अर्ध-बृहदान्त्र से अलग किए गए SQL कथनों वाली एक स्ट्रिंग को देखते हुए, निम्न फ़ंक्शन प्रत्येक व्यक्तिगत कथन को पार्स करता है और उन सभी को एक सरणी में लौटाता है। यह एक (गैर-तुच्छ) रेगेक्स और एक कॉल का उपयोग करता है preg_match_all()
, और एकल और बहु-पंक्ति टिप्पणियों, और एकल और दोहरे-उद्धृत स्ट्रिंग्स को सही ढंग से संभालता है, (जिनमें से प्रत्येक में गैर-समाप्ति अर्ध-कॉलन को अनदेखा किया जा सकता है):
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-08-15 संपादित करें: @jxmallett द्वारा इंगित किए गए रेगेक्स के बहु-पंक्ति टिप्पणी भाग में फिक्स्ड त्रुटि।2017-08-16 संपादित करें: सुव्यवस्थित रेगेक्स (रेगेक्स शेबैंग जोड़ा और अनावश्यक समूह को हटा दिया $2
)।