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 <<
Теперь я вывожу
{
$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 .
Название константы | Описание |
---|---|
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 зависит от используемой версии 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-сущности. По умолчанию преобразуется все без ограничений.