PHP 變量包含 HTML/JS 特殊字符(引號、換行、反斜杠),直接拼接到 JS 字符串會導致語法錯誤或 XSS 漏洞。
function jsformat(string $str): string {
$str = trim($str);
// 1. 合併多餘空白(可選,視業務而定)
$str = preg_replace('/\s+/', ' ', $str);
// 2. 移除換行符(JS 字符串不允許裸換行)
$str = str_replace(["\r\n", "\r", "\n"], ['\\n', '\\n', '\\n'], $str);
// 3. 轉義反斜杠(必須最先處理)
$str = str_replace('\\', '\\\\', $str);
// 4. 轉義引號(雙引號上下文)
$str = str_replace('"', '\\"', $str);
// 5. 轉義單引號(單引號上下文)
$str = str_replace("'", "\\'", $str);
// 6. 轉義 防止標籤閉合(XSS 關鍵)
$str = str_replace('', '<\\/script>', $str);
// 7. 可選:Unicode 轉義非 ASCII 字符(確保純 ASCII 輸出)
// $str = json_encode($str, JSON_UNESCAPED_UNICODE | JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP);
// return substr($str, 1, -1); // 去掉 json_encode 加的雙引號
return $str;
}
$html = '內容\n換行'; $jsSafe = jsformat($html); echo "";
$data = ['html' => $html, 'title' => '標題']; // 自動處理:引號、換行、Unicode、、控制字符 $jsCode = 'var data = ' . json_encode($data, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP) . ';'; echo "";
| 常量 | 作用 |
|---|---|
| JSON_HEX_TAG | < → \u003C,防 </script> 閉合 |
| JSON_HEX_APOS | ' → \u0027,單引號上下文安全 |
| JSON_HEX_QUOT | " → \u0022,雙引號上下文安全 |
| JSON_HEX_AMP | & → \u0026,HTML 實體安全 |
| JSON_UNESCAPED_UNICODE | 中文不轉 \uXXXX,可讀性好(需確保頁面 UTF-8) |
json_encode 或 jsformat。