Экранирование кавычек (htmlspecialchars)
Здравствуйте! Хочу задать заезженный вопрос касаемый экранирования спецсимволов. При добавлении в базу применяю функцию htmlspecialchars(). При выводе в
Текст текст «текст» , кавычки отображаются нормально, а вот в meta title Текст текст "текст" . Как сделать чтобы кавычки в TITLE отображались нормально и как грамотно реализовать данную задачу?Отслеживать
задан 20 мар 2014 в 23:43
308 1 1 золотой знак 5 5 серебряных знаков 20 20 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
htmlspecialchars() нужно выполнять не при добавлении в базу, а непосредственно при выводе на страницу (при подстановке в HTML-шаблон). При добавлении в базу данных нужно использовать функцию экранирования кавычек, которая перед кавычками добавляет обратный слэш («\»). Это может делать, например, mysqli_escape_string() . Экранирование кавычек при добавлении в БД нужно только для корректного сохранения, при сохранении бэкслэши уберутся и в базе будет храниться исходный вариант (без бэкслэшей). В базе данных желательно хранить текстовые значения в оригинальном виде. Если хранить их заранее обработанные htmlspecialchars() , то могут возникнуть трудности с поиском и выводом этих записей не в HTML (например, в JSON или в консоль). Поэтому при сохранении в базу текстовой строки (при подстановке её в SQL-запрос) используешь mysqli_escape_string() (на крайняк addslashes() ). При выводе в HTML оборачиваешь переменную с текстовым значением в htmlspecialchars() . Причём, в htmlspecialchars() надо оборачивать любые текстовые строки, которые не являются HTML-форматированными, вне зависимости берутся они из базы или нет.
Отслеживать
ответ дан 21 мар 2014 в 4:28
105 1 1 серебряный знак 9 9 бронзовых знаков
- php
- htmlspecialchars
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.4.30.8420
Как экранировать кавычки в PhpStorm
В какой язык вставили? А то я несколько раз замечал, что в том же php если внутрь строки вставляешь — то phpStorm сам кавычки экранирует.
На сайте с 02.08.2014
2 марта 2017, 19:37
Дикий пионер:
В какой язык вставили? А то я несколько раз замечал, что в том же php если внутрь строки вставляешь — то phpStorm сам кавычки экранирует.
Что бы автоматом не экранировал при вставке CTRL+Shift+Alt+V Если вы Вставляете текст в двойные кавычки в котором есть двойные кавычки, то они экранируется автоматом. Тоже самое касается и одинарных кавычек.
Строки и кавычки в PHP
Строки в PHP помещаются в одинарные или двойные кавычки. Одно из главных отличий в том, что в двойные кавычки можно подставить значение другой переменной:
Как PHP определяет название переменной в строке
Название переменной должно содержать в себе только цифры, буквы и нижнее подчёркивание. PHP принимает за название переменной всё, что находится между символом $ и первым не подходящим символом.
В следующем коде PHP неправильно определит название переменной и выдаст ошибку:
Результат в браузере:
Notice: Undefined variable: priceруб in D:\OpenServer\domains\programulin.ru\index.php on line 3
Для корректного определения названия переменной нужно поместить её в фигурные скобки:
руб"; // 1499руб
Нет однозначного мнения, какие кавычки нужно использовать для обычных строк, в которые ничего не нужно подставлять. Однако, многие программисты предпочитают использовать одинарные кавычки.
Дело в том, что двойные кавычки у многих вызывают ассоциацию «в эту строку что-то должно подставляться». Поэтому я рекомендую использовать одинарные кавычки для обычного текста, а двойные — только когда в текст нужно подставить переменную. Пример:
Экранирование кавычек
Если вам нужно поместить кавычки внутрь строки, есть 2 способа это сделать:
Во втором примере обратный слеш экранирует следующую за ним кавычку, чтобы PHP воспринял её как строку.
Как думаете, что нужно сделать, чтобы вывести на экран только обратный слеш? Ведь он будет экранировать закрывающую кавычку.
Для этого нужно написать второй слеш для экранирования первого:
Табуляция и перенос строки
Обратный слеш в двойных кавычках позволяет не только экранировать символы, но и подставлять некоторые специальные символы. Например, табуляцию (длинный пробел, который вы получаете при нажатии TAB) и перенос строки. Выглядят они следующим образом:
Напомню, что оба этих символа в HTML отображается браузерами как пробел, поэтому нет смысла пытаться вывести их напрямую. Но вы можете вывести их внутри тега textarea или записать в файл:
Задача 1
Напишите скрипт, который:
1. Создаёт переменную $type со значением Игра .
2. Создаёт переменную $name со значением «World of Warcraft» (с кавычками).
3. Выводит обе переменные внутри тега . Между переменными должен быть пробел.
$type $name";
Задача 2
Выведите этот текст на экран, правильно используя кавычки и экранирование (если это необходимо):
То самое 'чувство', когда кончились слова и отключена "фантазия", да ещё и кавычек " ' " напихали.
'; // Вариант 2 echo "То самое 'чувство', когда кончились слова и отключена \"фантазия\", да ещё и кавычек \" ' \" напихали.
"; // Вариант 3 echo "То самое 'чувство', когда кончились слова и отключена ",'"фантазия", да ещё и кавычек "', " ' ", '" напихали.
';
addcslashes
Возвращает строку, экранированную обратными слешами перед символами, указанными в параметре characters .
Список параметров
Список экранируемых символов. Если characters содержит символы \n , \r и т.п., они будут преобразованы в стиле C, тогда как другие нецифробуквенные символы с ASCII-кодами ниже 32 и выше 126 будут преобразованы в восьмеричное представление.
Следует быть внимательным при указании диапазона символов в аргументе characters . Проверяйте, какие символы входят в этот диапазон.
echo addcslashes ( ‘foo[ ]’ , ‘A..z’ );
// выводит: \f\o\o\[ \]
// Будут экранированы заглавные и строчные английские буквы
// . а также [\]^_`
?>?php
Также, если ASCII-код первого символа диапазона больше, чем последнего, диапазон не будет создан. Вместо этого будут экранироваться только первый символ, последний символ и точка. Для определения ASCII-кода символов используйте функцию ord() .
echo addcslashes ( «zoo[‘.’]» , ‘z..A’ );
// выводит: \zoo[‘\.’]
?>?php
Будьте внимательны при экранировании символов 0, a, b, f, n, r, t и v. Они будут преобразованы в \0, \a, \b, \f, \n, \r, \t и \v, которые являются предопределёнными escape-последовательностями в языке Си. Многие из этих последовательностей также определены в других Си-подобных языках, включая PHP. Это означает, что вы можете не получить ожидаемого результата, если будете использовать вывод функции addcslashes() для создания кода в этих языках с использованием этих символов в characters .
Возвращаемые значения
Возвращает экранированную строку.
Примеры
characters , например, «\0..\37», что проэкранирует все символы с ASCII-кодами от 0 до 31.
Пример #1 Пример использования addcslashes()
$escaped = addcslashes ( $not_escaped , «\0..\37!@\177..\377» );
?>?php
Смотрите также
- stripcslashes() — Удаляет экранирование символов, произведённое функцией addcslashes
- stripslashes() — Удаляет экранирование символов
- addslashes() — Экранирует строку с помощью слешей
- htmlspecialchars() — Преобразовывает специальные символы в HTML-сущности
- quotemeta() — Экранирует специальные символы
Improve This Page
User Contributed Notes 6 notes
19 years ago
If you are using addcslashes() to encode text which is to later be decoded back to it’s original form, you MUST specify the backslash (\) character in charlist!
$originaltext = ‘This text does NOT contain \\n a new-line!’ ;
$encoded = addcslashes ( $originaltext , ‘\\’ );
$decoded = stripcslashes ( $encoded );
//$decoded now contains a copy of $originaltext with perfect integrity
echo $decoded ; //Display the sentence with it’s literal \n intact
?>
If the ‘\\’ was not specified in addcslashes(), any literal \n (or other C-style special character) sequences in $originaltext would pass through un-encoded, but then be decoded into control characters by stripcslashes() and the data would lose it’s integrity through the encode-decode transaction.
16 years ago
addcslashes() treats NUL as a string terminator:
unless you order it backslashified:
assert(«any\\000body» === addcslashes(«any\0body», «\0»));
(Uncertain whether this should be declared a bug or simply that addcslashes() is not binary-safe, whatever that means.)
21 years ago
I have found the following to be much more appropriate code example:
$escaped = addcslashes ( $not_escaped , «\0..\37!@\@\177..\377» );
?>
This will protect original, innocent backslashes from stripcslashes.