在给定包含高位字符的字符串的情况下,为什么esc_html()不返回任何内容?

时间:2011-04-15 作者:BigToe

在PHP 5.2中,filter\\u var()清理文本。在WP中,esc\\u html()清理文本。前者适用于文本字符串中的高位字符,例如à,但后者没有。esc\\u 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();
?>
以下是输出:

原件:废话� 废话PHP消毒:废话WP消毒:

我不喜欢使用esc\\u html()。但如果改用filter\\u var(),则当我将字符串添加到WP自定义字段时,该字符串将消失。不知何故,WP卫生设施正在扼杀绳子。

我很困惑。如果你能提供线索,我将不胜感激。

2 个回复
SO网友:Chip Bennett

可能是因为实体是非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() in source

2) _wp_specialchars() in source

SO网友:BigToe

使用PHP filter_var() function with appropriate filters 允许将经过清理的文本插入元字段。esc\\U html出现的问题似乎是一些模糊的字符编码问题。

WordPress 3.2需要PHP 5.2。因此,如果您在使用WP esc\\u html()函数时遇到问题,PHP 5.2 filter\\u var是一个很好的替代方法。

结束

相关推荐

Disable escaping html

我在用SyntaxHighlighter Evolved 突出显示代码示例。E、 g。[csharp] string s = \"text\"; List<int> numbers = new List<int>(); [/csharp] 当我第一次保存它时,没关系,但编辑wordpress时,文本会更改为[csharp] string s = &quot;text&quot;; List&lt;int&am