Php спецсимволы. Htmlspecialchars - Преобразует специальные символы в HTML-сущности. Математические символы, поддерживаемые в HTML

Заметка: активирована адаптивная версия сайта, которая автоматически подстраивается под небольшой размер Вашего браузера и скрывает некоторые детали сайта для удобства чтения. Приятного просмотра!

Рад снова приветствовать всех на страницах блога посвящённому всем тонкостям успешного создания и продвижения сайтов – Site on! В сегодняшнем уроке по PHP мы затронем такие темы как: типы переменных, экранирование, спецсимволы, а также синтаксис heredoc в PHP.

Типы переменных

PHP имеет восемь различных типов переменных, из них

4 скалярных типа:

  • boolean (Булев или логический тип)
  • integer (Целые числа)
  • float (Число с плавающей точкой)
  • string (Строка)

2 смешанных типа:

  • array (Массив)
  • object (Объект)

2 специальных типа:

  • resource

Прежде чем перейти к рассмотрению каждого из типов более подробно, стоит уточнить, что PHP НЕ строго типизированный язык, а язык с динамической типизацией. Это значит, что нам не нужно заранее (при создании) объявлять тип каждой переменной. PHP сам догадается, какой тип имеет та или иная переменная, исходя из того, что мы в эту переменную положим. Это также значит, что в отличие от языков со строгой типизаций мы можем в переменную с числом (integer) взять и положить строку (string) и это не будет ошибкой! Это одна из особенностей PHP, которая очень нравится людям (новичкам), ранее не имевшим дело с программированием. Как правило, в итоге все приходят к тому, что это минус языка, а не плюс.

Boolean (логический) – простейший тип. Может принимать всего 2 значения: true или false (верно или неверно), они регистра-независимы (можно писать TRUE, trUe и тд.). Наглядный пример:

echo $name, "
", $name2; ?>

Результат:

Как видите, браузер не понимает булев тип, в отличие от PHP, поэтому при попытке вывести true или false он выведет на страницу число 1 или пустую строку .

При преобразовании в логический тип следующие значения рассматриваются как FALSE:

  • целое 0 (ноль)
  • число с плавающей точкой 0.0 (ноль)
  • пустая строка и строка "0" или "0"
  • пустой массив
  • специальный тип NULL (включая неустановленные переменные)

Все остальные значения рассматриваются как TRUE.

// десятичное число $int = -5; // отрицательное число $int = 05; // восьмеричное число $int = 0x1A; // шестнадцатеричное число
//Числа с плавающей точкой (вещественные): $flt = 1.4; $flt = 1.2e3; $flt = 7E-10; ?>

Однако самым часто применяемым типом в PHP можно считать именно строки (string) . Строки можно записывать либо в одинарных, либо в двойных кавычках, но записывать строки в двойных кавычках я никогда и никому не советую, так как тем самым вы заставляете интерпретатор PHP «парсить» вашу строку на наличие переменных в ней, чем хоть и незначительно, но замедляете работу. Даже если вы хотите использовать в вашей строке переменные – это можно сделать с помощью одинарных кавычек + (склеивание двух и более строк в одну). Для чего тогда двойные кавычки вообще нужны? Например, когда мы хотим использовать спецсимволы (\n, \r и тд.), но о них немного позже.

Также стоит отметить, что использование одинарных кавычек + конкатенации делает код гораздо читабельней, чем если всё без разбора засовывать в двойные кавычки. Но хватит предисловий, сейчас вы сами всё увидите и поймёте:

$number = 2; //integer $hand1 = "Количество рук у человека:"; //string + заставляем парсить на наличие переменных $hand2 = "Количество рук у человека:"; //string
//добавим в эти строки переменную $number: $hand1 = "Количество рук у человека: $number и ещё текст..."; // НЕ рекомендую $hand2 = "Количество рук у человека: " . $number . " и ещё текст..."; // рекомендую!
echo $hand1, "
", $hand2; ?>

Результат:

Подробнее о конкатенации мы поговорим в следующей статье.

  • ей была присвоена константа NULL .
  • ей еще не было присвоено какое-либо значение.
  • она была удалена с помощью unset()

Изучение оставшихся типов переменных на данном этапе было бы бессмысленным. С остальными типами мы столкнёмся и разберём их при более глубоком изучении PHP.

Экранирование в PHP

А что если мы в нашей строке не хотим доставать значение переменной, а хотим написать буквально $number? Рассмотрим два варианта:

$hand1 = "Количество рук у человека: \$number и ещё текст..."; // НЕ рекомендую $hand2 = "Количество рук у человека: $number и ещё текст..."; // рекомендую!
echo $hand1, "
", $hand2; ?>

Результат:

В первом варианте (с двойными кавычками) мы использовали экранирование спецсимвола доллара, благодаря чему данный спецсимвол перестал иметь своё специальное назначение (обозначение переменных) и превратился в обыкновенный знак доллара.

Во втором варианте (с одинарными кавычками) как вы уже знаете – PHP интерпретатор даже не пытался найти переменных в строке, а потому экранирование не потребовалось.

Спецсимволы в PHP

Специально для читателей блога Site on! я подготовил небольшой список специальных символов в языке программирования PHP:

  • \n новая строка
  • \r возврат каретки
  • \t горизонтальная табуляция
  • \\ обратная косая черта (обратный слеш)
  • \$ знак доллара
  • \" двойная кавычка

Посмотрим на работу спецсимволов на примере \n – спецсимвол, который делает перевод на новую строку (как Энтер), однако браузеры не понимают (и не должны) его и игнорируют, но результат его работы можно посмотреть в исходном коде страницы:

echo $rule, "
", $rule2; ?>

Результат:

Исходный код (Ctrl + U):

Если для посетителей в браузере спецсимвол \n никак не отображается, тогда в чём его смысл?

Во-первых, с помощью спецсимволов и \n в частности можно удобно форматировать код на странице (как в примере выше).

Во-вторых, \n можно использовать, например, при операциях записи в файл, чтобы сделать перенос (Энтер) и продолжить запись на новой строке.

Альтернативой такого форматирования является .

Синтаксис heredoc в PHP

Результат:

Исходный код (Ctrl + U):

Результат говорит сам за себя, теперь давайте разберемся, как же всё устроено:

  • Строка начинается с трёх угловых скобочек <<<, далее следует имя идентификатора.
  • Строка с открывающим идентификатором (меткой) ни в коем случае не должна содержать после него никаких других символов, включая пробел. То есть другими словами, сразу после нашей метки мы должны поставить Энтер, без пробела, сразу Энтер!

Строка в PHP - это набор символов любой длины. В отличие от Си, строки могут содержать в себе также и нулевые символы, что никак не повлияет на программу. Иными словами, строки можно использовать для хранения бинарных данных. Длина строки ограничена только размером свободой оперативной памяти.

В PHP символ это то же самое, что и байт, это значит, что возможно ровно 256 различных символов. Это также означает, что PHP не имеет встроенной поддержки Unicode. Некоторую поддержку Unicode обеспечивают функции utf8_encode() и utf8_decode() .

Строка легко может быть обработана при помощи стандартных функций, можно также непосредственно обратиться к любому ее символу.

Простой пример строковой переменной:

$ a = "Это просто текст, записанный в строковую переменную" ;
echo $ a ; //Выводит "Это просто текст, записанный в строковую переменную"
?>

А теперь подробно разберем синтаксис типа данных string .

Синтаксис типа string (строк)

Строка может быть определена тремя различными способами.

Простейший способ определить строку - это заключить ее в одинарные кавычки (символ " ).

Чтобы использовать одинарную кавычку внутри строки, как и во многих других языках, ее необходимо предварить символом обратной косой черты (\ ), т. е. экранировать ее. Если обратная косая черта должна идти перед одинарной кавычкой либо быть в конце строки, вам необходимо продублировать ее. Обратите внимание, что если вы попытаетесь экранировать любой другой символ, обратная косая черта также будет напечатана! Так что, как правило, нет необходимости экранировать саму обратную косую черту.

В отличие от двух других синтаксисов, переменные и экранирующие последовательности для специальных символов, встречающиеся в строках, заключенных в, не обрабатываются.

Приведем пример использования одинарных кавычек:

echo "это простая строка" ;

Echo "Также вы можете вставлять в строки
символ новой строки таким образом,
поскольку это нормально"
;

// Выведет: Однажды Арнольд сказал: "I"ll be back"
echo "Однажды Арнольд сказал: "I\"ll be back"" ;

Echo "Вы удалили C:\\*.*?" ;

// Выведет: Вы удалили C:\*.*?
echo "Вы удалили C:\*.*?" ;

// Выведет: Это не вставит: \n новую строку
echo "Это не вставит: \n новую строку" ;

// Выведет: Переменные $expand также $either не подставляются
echo "Переменные $expand также $either не подставляются" ;
?>

Если строка заключена в двойные кавычки (" ), PHP распознает большее количество управляющих последовательностей для специальных символов:

Таблица управляющих последовательностей:

Последовательность Значение
\n новая строка (LF или 0x0A (10) в ASCII)
\r возврат каретки (CR или 0x0D (13) в ASCII)
\t горизонтальная табуляция (HT или 0x09 (9) в ASCII)
\\ обратная косая черта
\$ знак доллара
\" двойная кавычка
\{1,3} последовательность символов, соответствующая регулярному выражению, символ в восьмеричной системе счисления
\x{1,2} последовательность символов, соответствующая регулярному выражению, символ в шестнадцатеричной системе счисления

Еще раз напомним, что если вы захотите мнемнонизировать любой другой символ, обратная косая черта также будет напечатана!

Другой способ определения строк - это использование heredoc-синтаксиса ("<<< "). После <<< необходимо указать идентификатор, затем идет строка, а потом этот же идентификатор, закрывающий вставку.

Закрывающий идентификатор должен начинаться в первом столбце строки. Кроме того, идентификатор должен соответствовать тем же правилам именования, что и все остальные метки в PHP: содержать только буквенно-цифровые символы и знак подчеркивания, и должен начинаться с нецифры или знака подчеркивания.

Внимание! Очень важно отметить, что строка с закрывающим идентификатором не содержит других символов, за исключением, возможно, точки с запятой (; ). Это означает, что идентификатор и что не может быть никаких пробелов или знаков табуляции до или после точки с запятой. Важно также понимать, что первым символом перед закрывающим идентификатором должен быть символ новой строки, определенный в вашей операционной системе. Например, на Windows® это \r .

Если это правило нарушено и закрывающий идентификатор не является "чистым", считается, что закрывающий идентификатор отсутствует и PHP продолжит его поиск дальше. Если в этом случае верный закрывающий идентификатор так и не будет найден, то это вызовет ошибку в обработке с номером строки в конце скрипта.

Heredoc -текст ведет себя так же, как и строка в двойных кавычках, при этом их не имея. Это означает, что вам нет необходимости экранировать кавычки в heredoc, но вы по-прежнему можете использовать вышеперечисленные управляющие последовательности. Переменные обрабатываются, но с применением сложных переменных внутри heredoc нужно быть также внимательным, как и при работе со строками.

Пример определения heredoc-строки:

$str = <<Пример строки,
охватывающей несколько строчек,
с использованием heredoc-синтаксиса.
EOD;

/* Более сложный пример с переменными. */
class foo
{
var $foo ;
var $bar ;

Function foo ()
{
$this -> foo = "Foo" ;
$this -> bar = array("Bar1" , "Bar2" , "Bar3" );
}
}

$foo = new foo ();
$name = "МоеИмя" ;

Echo <<Меня зовут "$name". Я печатаю $foo -> foo.
Теперь я вывожу
{ $foo -> bar [ 1 ]} .
Это должно вывести заглавную букву "A":
\x41
EOT;
?>

(PHP 4, PHP 5, PHP 7)

htmlspecialchars — Преобразует специальные символы в HTML-сущности

Описание

String htmlspecialchars (string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ini_get("default_charset") [, bool $double_encode = true ]]])

В HTML некоторые символы имеют особый смысл и должны быть представлены в виде HTML сущностей, чтобы сохранить их значение. Эта функция возвращает строку, над которой проведены эти преобразования. Если вам нужно преобразовать все возможные сущности, используйте htmlentities() .

Если входная строка переданная в эту функцию и результирующий документ используют одинаковую кодировку символов, то этой функции достаточно, чтобы подготовить данные для вставки в большинство частей HTML документа. Однако, если данные содержат символы, не определенные в кодировке символов результирующего документа и вы ожидаете сохранения этих символов (как числовые или именованные сущности), то вам недостаточно будет этой и htmlentities() функций (которые только преобразуют подстроки с соответствующими сущностями). Необходимо использовать функцию mb_encode_numericentity() .

Производятся следующие преобразования:

  • "&" (амперсанд) преобразуется в "&"
  • """ (двойная кавычка) преобразуется в """ в режиме ENT_NOQUOTES is not set.
  • """ (одиночная кавычка) преобразуется в """ (или ") только в режиме ENT_QUOTES .
  • "<" (знак "меньше чем") преобразуется в "<"
  • ">" (знак "больше чем") преобразуется в ">"

Список параметров

Конвертируемая строка (string ).

Битовая маска из нижеуказанных флагов, определяющих режим обработки кавычек, некорректных кодовых последовательностей и используемый тип документа. По умолчанию используется ENT_COMPAT | ENT_HTML401 .

Доступные значения параметра flags
Название константы Описание
ENT_COMPAT Преобразует двойные кавычки, одинарные кавычки не изменяются.
ENT_QUOTES Преобразует как двойные, так и одинарные кавычки.
ENT_NOQUOTES Оставляет без изменения как двойные, так и одинарные кавычки.
ENT_IGNORE Без всяких уведомительных сообщений отбрасывает некорректные кодовые последовательности вместо возврата пустой строки. Использование этого флага не рекомендуется, так как это может привести к » негативным последствиям, связанным с безопасностью .
ENT_SUBSTITUTE Заменяет некорреткные кодовые последовательности символом замены Юникода U+FFFD в случае использования UTF-8 и FFFD; при использовании другой кодировки, вместо возврата пустой строки.
ENT_DISALLOWED Заменяет неверные коды символов для заданного типа документа символом замены юникода U+FFFD (UTF-8) или FFFD; (при использовании другой кодировки) вместо того, чтобы оставлять все как есть. Это может быть полезно, например, для того, чтобы убедиться в формальной правильности XML-документов со встроенным внешним контентом.
ENT_HTML401 Обработка кода в соответствии с HTML 4.01.
ENT_XML1 Обработка кода в соответствии с XML 1.
ENT_XHTML Обработка кода в соответствии с XHTML.
ENT_HTML5 Обработка кода в соответствии с HTML 5.
encoding

Необязательный аргумент определяющий кодировку, используемую при конвертации симоволов.

Если не указан, то значением по умолчанию для encoding зависит от используемой версии PHP. В PHP 5.6 и старше, для значения по умолчанию используется конфигурационная опция default_charset . В PHP 5.4 и 5.5 используется UTF-8 по умолчанию. Более ранние версии PHP используют ISO-8859-1 .

Хотя этот аргумент является технически необязательным, настоятельно рекомендуется указать правильное значение для вашего кода, если вы используете PHP 5.5 или выше, или если ваша опция конфигурации default_charset может быть задана неверно для входных данных.

Для целей этой функции кодировки ISO-8859-1 , ISO-8859-15 , UTF-8 , cp866 , cp1251 , cp1252 и KOI8-R являются практически эквивалентными, предполагая то, что сама строка string содержит корректные символы в указанной кодировке, то символы, изменяемые htmlspecialchars() , останутся на тех же местах во всех этих кодировках.

Поддерживаются следующие кодировки:

Поддерживаемые кодировки
Кодировка Псевдонимы Описание
ISO-8859-1 ISO8859-1 Западно-европейская Latin-1.
ISO-8859-5 ISO8859-5 Редко используемая кириллическая кодировка (Latin/Cyrillic).
ISO-8859-15 ISO8859-15 Западно-европейская Latin-9. Добавляет знак евро, французские и финские буквы к кодировке Latin-1(ISO-8859-1).
UTF-8 8-битная Unicode, совместимая с ASCII.
cp866 ibm866, 866 Кириллическая кодировка, применяемая в DOS.
cp1251 Windows-1251, win-1251, 1251 Кириллическая кодировка, применяемая в Windows.
cp1252 Windows-1252, 1252 Западно-европейская кодировка, применяемая в Windows.
KOI8-R koi8-ru, koi8r Русская кодировка.
BIG5 950 Традиционный китайский, применяется в основном на Тайване.
GB2312 936 Упрощенный китайский, стандартная национальная кодировка.
BIG5-HKSCS Расширенная Big5, применяемая в Гонг-Конге.
Shift_JIS SJIS, SJIS-win, cp932, 932 Японская кодировка.
EUC-JP EUCJP, eucJP-win Японская кодировка.
MacRoman Кодировка, используемая в Mac OS.
"" Пустая строка активирует режим определения кодировки из файла скрипта (Zend multibyte), default_charset и текущей локали (см. nl_langinfo() и setlocale() ), в указанном порядке. Не рекомендуется к использованию.

Замечание : Остальные кодировки не поддерживаются, вместо них будет применена кодировка по умолчанию и сгенерировано предупреждение.

double_encode

Если параметр double_encode выключен, то PHP не будет преобразовывать существующие html-сущности. По умолчанию преобразуется все без ограничений.