44件中 41-44件目     [ 1 2 3 4 5 6 7 8 9 ]

新しい環境にMySQLやPHPなどを入れたところ、MySQLを直接いじれば文字化けしないのに、PHPからMySQLに日本語データを入れた場合にのみ文字化けが起きた。 これは以前、直したことがあったのだが、かなり前のことだったので忘れてしまっていて、直すのに無駄に時間がかかってしまった。

この文字化けの原因は、MySQLのデフォルトの文字コードがlatin1で、さらにそれがスウェーデン語として扱われるためだ。 mysqlコマンドでstatusと打ち込むと、現在の設定が表示され、その中に文字コードの設定がある。

> status
(※省略)
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    latin1
Conn.  characterset:    latin1
(※省略)

PHPには、文字列からタグを取り除くstrip_tags関数があり、マニュアルにはこの関数に関して以下のような注意書きが書かれている。

現在、strip_tags()はHTMLの検証を行わないため、不完全または壊れたタグにより予想以上に多くのテキスト/データが削除される可能性があります。

これが具体的にどういう場合に起こるのか詳しく書かれていないので、どんな規則に従ってタグを取り除くのか調べてみた。

strip_tags関数の動作検証 (ソースコード)

どうもこの関数は、「<」のあとに空白と改行以外の文字が続くとそれをタグの始まりとみなし、「>」を見つけるまでの間を削除するようだ。 ただし、「"」や「'」で囲まれた中にある「>」はタグの終了と見なさない。 閉じられない場合は、最後まで削除する。

「lt;」のあとに記号や日本語がきても無条件で削除してしまうのでは使いにくいが、将来、新しいタグが出現する可能性を考えればこの動作は正しい。 strip_tagsが余計なテキストを削除するとしても、確実に有効なタグは取り除いてくれるようなので、それほど悪い関数でもないようだ。 ブラウザによって、HTMLの有効なタグの定義も変わってくるので、有効なタグのみを削除するというのもかなり難しい話だと思う。

タグは削除するよりも、htmlspecialchars関数などで無効化するのが無難な気がする。


「hoge○○hoge○○○○hoge○○hoge○」という文字列があり、PHP+正規表現で行頭以外にあるhogeを全てHOGEに置換して、「hoge○○HOGE○○○○HOGE○○HOGE○」としたかったのだが、やり方がよくわからなかった。 行頭にある「hoge」マッチする正規表現であれば以下のように簡単に書けるが、行頭以外にあるhogeにマッチする正規表現がわからなかったのでいろいろと試してみた。

preg_replace('/^hoge/', 'HOGE', $text);

PHPのパースモードの開始タグは普通、<?php ?>を使い、その省略形として<? ?>があることは知っていたが、これ以外に2つも書き方があるとは知らなかった。 正確に言えば、1つは忘れていただけだったが。

1つ目は、<% %>。
これはphp.iniのasp_tagsを変更する必要がある。 設定ファイルを見ていたときに、「こんなこともできるのか」と思ったが、すっかり忘れていた。

2つ目は、<script language="php"> </script>。
JavaScriptのような書き方だ。 これは書くのがめんどくさい上に、この書き方をサポートしていないエディタもあるようで、良い点は特に見当たらない。


44件中 41-44件目     [ 1 2 3 4 5 6 7 8 9 ]