(正規表現, PHP, JavaScript) SQLの区切り文字として使われているバッククオートだけを置換したい

MySQL用のSQLSQLite用に変換する際に必要な処理です。


(変換前)
INSERT INTO `tbl` (`id`, `name`, `explain`) VALUES (1, 'aaa\'\'置換したくないバッククオート→`', '置換したくないバッククオート→`aaaaaa\\');

(変換後)
INSERT INTO "tbl" ("id", "name", "explain") VALUES (1, 'aaa\'\'置換したくないバッククオート→`', '置換したくないバッククオート→`aaaaaa\\');


PHP, JavaScript共に、下記のような手順で置換を行います。


クオートで囲まれた文字列、
または、
バッククオート、
を抜き出し、
コールバック関数へ送る。
前者はヒットした値をそのまま返す。
後者はダブルクオートを返す。


※ クオートで囲まれた文字列を抜き出す正規表現については、下記の記事をご覧ください。
【参考】
(正規表現, PHP, JavaScript)ある囲み記号で囲まれた文字列を抜き出す。ただし、エスケープされた囲み記号にも対処する。
http://d.hatena.ne.jp/sutara_lumpur/20120720/1342760656


では、実例です。


(PHP)
$str = "INSERT INTO `tbl` (`id`, `name`, `explain`) VALUES (1, 'aaa\\'\\'置換したくないバッククオート→`', '置換したくないバッククオート→`aaaaaa\\\\');";
$str = preg_replace_callback('/(\'(?:(?:(?!\\\\).)?(?:(?:\\\\\\\\)*\\\\)\'|[^\'])*\')|(`)/us', 'callback_backquote', $str);
echo $str;
function callback_backquote($matches) {
if (isset($matches[2])) {
//SQLite用に、バッククオートをダブルクオートに変換する。
return '"';
} elseif (isset($matches[1])) {
//クオートで囲まれた文字列はそのまま返す。
//中にバッククオートがある場合、ダブルクオートには変換されない。
return $matches[1];
}
}

(JavaScript)
var str = "INSERT INTO `tbl` (`id`, `name`, `explain`) VALUES (1, 'aaa\\'\\'置換したくないバッククオート→`', '置換したくないバッククオート→`aaaaaa\\\\');";
str = str.replace(
/('(?:(?:(?!\\).)?(?:(?:\\\\)*\\\\)'|[^'])*')|(`)/gm,
function(){
if (arguments[2]) {
return '"';
} else if (arguments[1]) {
return arguments[1];
}
}
);
alert(str);