在 PHP 中輸出 JavaScript 程式碼或 JSON 資料時,必須妥善處理特殊字元(換行、引號、反斜線等),否則會導致 JS 語法錯誤或 XSS 風險。本文提供一個實用的 jsformat() 函數,將任意字串轉為安全的 JS 字串常值。
<?php
function jsformat($str)
{
$str = trim($str);
// 合併連續空白
$str = preg_replace('/\s+/', ' ', $str);
// 移除換行符
$str = str_replace(["\n", "\r"], '', $str);
// 轉義反斜線(必須最先處理)
$str = str_replace('\\', '\\\\', $str);
// 轉義雙引號
$str = str_replace('"', '\\"', $str);
// 轉義單引號
$str = str_replace("'", "\\'", $str);
return $str;
}
?>
<?php
$raw = 'He said: "Hello\nWorld" & it\'s great.';
$safe = jsformat($raw);
echo "<script> var msg = \"{$safe}\"; </script>";
// 輸出:var msg = "He said: \"HelloWorld\" & it\\'s great.";
?>
\\,再處理引號,避免重複轉義。PHP 5.3+ 可直接使用 json_encode(),它自動處理所有 JS/JSON 轉義規則,且支援 Unicode:
<?php
$jsSafe = json_encode($raw, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP);
// 輸出含雙引號的合法 JS 字串常值,可直接嵌入 script 標籤
echo "<script> var msg = {$jsSafe}; </script>";
?>
建議: 新專案優先使用 json_encode(),僅在舊版環境或特殊格式需求時採用自訂函數。