132件中 121-125件目     [ ... 18 19 20 21 22 23 24 25 26 27 ]

以下のようなIDと名前がセットになった配列データを送ることを考える。

Array
(
	[list] => Array
	(
		[1] => Array
		(
			[id] => 3
			[name] => 家康
		)
		[2] => Array
		(
			[id] => 5
			[name] => 秀忠
		)
		[3] => Array
		(
			[id] => 4
			[name] => 家光
		)
	)
)

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);

SQLで以下のようにテーブルを結合すると、どちらか一方にNULLを含んだデータや一方にデータが存在しないものは結果として出てこない。

SELECT * FROM a,b WHERE a.id = b.id
SELECT * FROM a JOIN b ON (a.id = b.id)

この結合を内部結合(INNER JOIN)という。


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

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

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


132件中 121-125件目     [ ... 18 19 20 21 22 23 24 25 26 27 ]