#6.12 php web приложения Кодирование тегов HTML

В предыдущем разделе теги просто удалялись из текста. Но что делать, если требуется отобразить текст, содержащий HTML-теги, но при этом ещё и обеспечить безопасность приложения? В этом случае уместно использовать функцию htmlentities, которая осуществляет кодирование тегов, преобразовывая их в последовательность специальных символов. Например, текст, <B>Bacn</B> будет преобразован в строку &lt;B&gt;Bacn&lt;/B&gt;, которая при отображении её браузером выглядит как обычная строка. Использование этой функции приведено в примере 1.

Замечание

Начиная с PHP 4.0.3, в функцию добавлен необязательный параметр quote_style, который задает способ преобразования кавычек. Возможные его значения приведены в таблице 1. Начиная с PHP 4.1.0 в функцию добавлен третий необязательный аргумент charset, который задает используемую кодировку текста. При обработке англоязычных данных это не так важно, но при работе с кирилицей кодировка должна быть задана явно. По умолчанию используется кодировка ISO-8859-IJ. Наиболее употребительные значения параметра приведены в таблице 2.

Таблица 1. Возможные значения параметра quote_style

Значение Описание
ENT_COMPAT Преобразуются двойные кавычки, одинарные остаются без изменений
ENT_QUOTES Преобразуются и двойные, и одинарные кавычки
ENT_NOQUOTES И двойные, и одинарные кавычки остаются без изменений

Таблица 2. Возможные значения параметра charset

Кодировка Псевдоними Описание
ISO-8859-1 ISO8859-1 Западно-европейская Latin-1
ISO-8859-15 ISO8859-15 Западно-европейская Latin-9. Добавляет знак евро, французские и финские буквы к кодировке Latin-1(ISO-8859-1).
UTF-8 8-битная Unicode, совместимая с ASCII.
cp866 ibm866, 866 Кириллическая кодировка, применяемая в DOS. Поддерживается в версии 4.3.2.
cp1251 Windows-1251, win-1251, 1251 Кириллическая кодировка, применяемая в Windows. Поддерживается в версии 4.3.2.
cp1252 Windows-1252, 1252 Западно-европейская кодировка, применяемая в Windows.
KOI8-R koi8-ru, koi8r Русская кодировка. Поддерживается в версии 4.3.2.

Пример 1. Кодирование HTML-тегов

<HTML>
    <HEAD>
        <TITLE>
            Кодирование тегов
        </TITLE>
    </HEAD>
    <BODY>
        <CENTER>
            <H1>Кодирование тегов</H1>
            <?php 
                $errors = array();
                if (isset($_REQUEST["seen_already"])) {
                    validate_data();
                    if (count($errors) > 0) {
                        display_errors();
                        display_form();
                    } else {
                        process_data();
                    }
                } else {
                    display_form();
                }
 
                function validate_data()
                {
                    global $errors;
                    if($_REQUEST["Name"] == "")
                    {
                        $errors[] = "<FONT COLOR='RED'>Имя обязательно для ввода</FONT>";
                    }
                }   
 
                function display_errors()
                {
                    global $errors;
                    foreach ($errors as $err)
                    {
                        echo $err, "<BR>";
                    }
                }
 
                function process_data()
                {
                    echo "Ваше имя: ";
                    $ok_text = htmlentities($_REQUEST["Name"],  ENT_QUOTES, 'UTF8');
                    echo $ok_text;
                }
 
                function display_form()
                {
                    echo "<FORM METHOD='POST' ACTION='phpencode.php'>";
                    echo "Введите ваше имя:";
                    echo "<BR>";
                    echo "<INPUT NAME='Name' TYPE='TEXT'>";
                    echo "<BRxBR>";
                    echo "<INPUT TYPE=SUBMIT VALUE='OK'>";
                    echo "<INPUT TYPE=HIDDEN NAME='seen_already'
                    VALUE= 'data'>";
                    echo "</FORM>";
                }
            ?>
        </CENTER>
    </BODY>
</HTML>
                

На этот раз, если пользователь ввел текст, содержащий HTML-теги, как на рисунке 1, то при формировании страницы теги сохранятся, но в этом случае они будут представлять из себя просто текст (см. рисунк 2).



Рис. 1. Попытка ввода HTML-тегов



Рис. 2. Теги отображаются как простой текст

Key Words for FKN + antitotal forum (CS VSU):