bigtoe
  • 0
Новичок

Почему esc_html() ничего не возвращает, учитывая строку, содержащую старший бит?

  • 0

В 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();
?>

Вот результат:

оригинал: бла-бла-бла

PHP очищено: бла-бла

WP очищено:

Я не одержим использованием esc_html(). Но если я использую вместо этого filter_var(), строка исчезает, когда я добавляю ее в настраиваемое поле WP. Каким-то образом санитария WP убивает строку.

Я озадачен. Был бы признателен за наводку.

Share
  1. Дополнительное примечание: используя удобную консоль отладки WP wordpress.org/extend/plugins/debug-bar-console, я попробовал

    • 0
  2. Возможно, потому что сущность не является символом 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() в источнике

    • 0
  3. Использование функции PHP filter_var() с соответствующими фильтрами позволяет вставлять очищенный текст в метаполе. То, что происходит с esc_html, кажется какой-то неясной проблемой кодирования символов.

    Для WordPress 3.2 потребуется PHP 5.2. Итак, если у вас возникли проблемы с функцией WP esc_html(), хорошей альтернативой будет filter_var из PHP 5.2.

    • 0

Оставить ответ

You must login to add an answer.