javascript文字リテラルのエスケープ方法

シングルクォートもきちんとエスケープする - 素人がプログラミングを勉強していたブログに触発されて。
こんなソースを

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Hello</title>
<script type="text/javascript">
//<![CDATA[
var data1 = "&lt;/script\>&lt;script\>alert(\"1\")</script\>]]\>";
//]]>
</script>
</head>
<body>
<a href="#" onclick="alert(data1);return false;">aaaa</a>
</body>
</html>

IE7、FireFox3、Opera9.2.6、safari3,chrome(beta)似て表示。
結果、すべてで

  • ロード中、ロード後にアラートは表示されない。
  • リンクをクリックすると"<script>alert("1")</script>\]\]>"と表示される。

を確認。
(閉じブラケットを二重にしたら表示されなかったヨ@はてな。バックスラッシュ入れてみたがどうだろう>だめだった。どうすりゃいいの?とりあえずバックスラッシュ+"]"にした)

結論

  • \(バックスラッシュ、円記号)は2重(\\)に
  • >(>)は \> に
  • "(")は \" に
  • 文字列をシングルクォーテーションで囲みたいなら'を \' に
  • でもめんどくせーよ文字列は全部 " (ダブルクォーテーション)でくくろうよJSON仕様もそうだし
  • 改行、復帰もそれぞれ \n \r にしよう
  • 他制御コード(\t,\b,\f)も改行復帰と同じように
  • 他の表示できない文字は捨てるか\unnnnにする。

(前提:すべてutf-8を使う)
さて、これをPHPで実装する方法は…どうやんの?

抜け、バグ、嘘、大げさな表現があれば指摘歓迎。