PHP 5.2では、filter_var()はテキストをサニタイズします。 WPでは、esc_html()はテキストをサニタイズします。前者は、テキスト文字列内の上位ビット文字で機能します。あ、でも後者は違います。 esc_htmlは、ハイビット文字を含む文字列を完全に食べているようです。これは、単純なWPプラグインとして書かれた例です。
<?php
/*
Plugin Name: bugz tester
*/
class bugz_tester {
function __construct() {
if ( ! is_admin() )
return;
add_action('admin_menu', array(&$this,'admin_page'));
}
function admin_page() {
add_options_page('Bugz tester', 'bugz', 'edit_posts', 'bugz_sheet', array(&$this,'test_page'));
}
function test_page() {
?>
<div class="wrap">
<?php
$ts = 'blah à blah';
echo "original: " . $ts . "<br/>" ;
echo "PHP sanitized: " . $this->sanitize_txt( $ts ) . "<br/>" ;
echo "WP sanitized: " . esc_html( $ts ) . "<br/>";
die();
?>
</div>
<?php
}
function sanitize_txt ( $text ) {
$san_text = filter_var($text, FILTER_SANITIZE_STRING, FILTER_FLAG_ENCODE_HIGH | FILTER_FLAG_STRIP_LOW ) ;
return $san_text;
}
}
new bugz_tester();
?>
これが出力です。
原文:blah blah
PHPがサニタイズされました:blahàblah
WPはサニタイズした:
私はesc_html()の使用に夢中になっていません。しかし、代わりにfilter_var()を使用すると、WPカスタムフィールドに追加すると文字列は消えます。どういうわけかWP公衆衛生はひもを殺しています。
私は謎です。手がかりをいただければ幸いです。
おそらく、エンティティがUTF8以外の文字なのでしょうか。
これがesc_html()
の動作です。
function esc_html( $text ) {
$safe_text = wp_check_invalid_utf8( $text );
$safe_text = _wp_specialchars( $safe_text, ENT_QUOTES );
return apply_filters( 'esc_html', $safe_text, $text );
}
そうでなければ、それは_wp_specialchars()
によってフィルタリングされたときにサニタイズされます。
参考のため:
1)ソース内のesc_html()
2)ソース内の_wp_specialchars()
PHPのfilter_var()関数を適切なフィルタ とともに使用すると、サニタイズされたテキストをメタフィールドに挿入できます。 esc_htmlで起こっていることは、あいまいな文字コーディングの問題のようです。
WordPress 3.2ではPHP 5.2が必要になります。そのため、WP esc_html()関数で問題が発生した場合は、PHP 5.2 filter_varが適切な選択肢です。