php sql 语法解析函数,非常实用
程序员文章站
2022-06-12 16:29:24
...
if (!function_exists('parse_sql')) {
/**
* 分割sql语句
* @param string $content sql内容
* @param array $prefix 替换前缀
* @param bool $limit 如果为1,则只返回一条sql语句,默认返回所有 *
* @return array|string 除去注释之后的sql语句数组或一条语句
*/
function parse_sql($sql = '', $prefix = [], $limit = 0) {
// 被替换的前缀
$from = '';
// 要替换的前缀
$to = '';
// 替换表前缀
if (!empty($prefix)) {
$to = current($prefix);
$from = current(array_flip($prefix));
}
if ($sql != '') {
// 纯sql内容
$pure_sql = [];
// 多行注释标记
$comment = false;
// 按行分割,兼容多个平台
$sql = str_replace(["\r\n", "\r"], "\n", $sql);
$sql = explode("\n", trim($sql));
// 循环处理每一行
foreach ($sql as $key => $line) {
// 跳过空行
if ($line == '') {
continue;
}
// 跳过以#或者--开头的单行注释
if (preg_match("/^(#|--)/", $line)) {
continue;
}
// 跳过以/**/包裹起来的单行注释
if (preg_match("/^\/\*(.*?)\*\//", $line)) {
continue;
}
// 多行注释开始
if (substr($line, 0, 2) == '/*') {
$comment = true;
continue;
}
// 多行注释结束
if (substr($line, -2) == '*/') {
$comment = false;
continue;
}
// 多行注释没有结束,继续跳过
if ($comment) {
continue;
}
// 替换表前缀
if ($from != '') {
$line = str_replace('`'.$from, '`'.$to, $line);
}
if ($line == 'BEGIN;' || $line =='COMMIT;') {
continue;
}
// sql语句
array_push($pure_sql, $line);
}
// 只返回一条语句
if ($limit == 1) {
return implode("",$pure_sql);
}
// 以数组形式返回sql语句
$pure_sql = explode(";\n", $pure_sql);
print_r($pure_sql);
return $pure_sql;
} else {
return $limit == 1 ? '' : [];
}
}
}
上一篇: janusgraph线上schema过程Debug
下一篇: PHP字符串解析函数