- Htmlspecialchars decode не работает
- PHP, html_entity_decode и htmlspecialchars_decode не будут работать
- 3 ответа
- htmlspecialchars — проблема с php htmlspecialchars_decode ()
- Решение
- htmlspecialchars_decode
- Описание
- Список параметров
- Возвращаемые значения
- Список изменений
- Примеры
- Смотрите также
- User Contributed Notes 8 notes
Htmlspecialchars decode не работает
Здесь могла бы быть ваша реклама
Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006
Откуда: Israel
Секрет
Теперь, когда вы уже наверняка второпях отправили свой запрос,
я расскажу вам простой секрет, который сэкономит вам уйму ожиданий,
даже если первый ответ по теме последуем сразу же.
Само собой я знаю что ответят мне тут же, и если я посмотрю
на сообщения на форуме, то пойму что в общем то я и не ошибаюсь.
Но еще я точно замечу, что очень мало тем, в которых всего два ответа :
вопрос автора и еще два сообщение вида Ответ + Спасибо
После этого приходится начинать уточнять этим неграмотным что мне надо.
Они что, сами читать не умеют? А уточнять приходится.
И иногда пока они переварят то что я им скажу проходит и не одна ночь..
Уверен что если бы я им сказал что у меня есть
фиолетовый квадрат, и нужно превратить его в синий треугольник
и я пытался взять кисточку, макнуть в банку и поводить ей по квадрату
но почему то кисточка не принимала цвет краски в банке,
то на мой вопрос — где взять правильные банки мне бы ответили гораздо быстрее
предложив её открыть, а не тратить еще стольник на жестянку.
Поэтому с тех пор я строю свои вопросы по проверенной давным давно схеме:
Что есть
Что нужно получить
Как я пытался
Почему или что у меня не получилось.
На последок как оно происходит на форумах
Новичок: Подскажите пожалуста самый крепкий сорт дерева! Весь инет перерыл, поиском пользовался!
Старожил: Объясни, зачем тебе понадобилось дерево? Сейчас оно в строительстве практически не используется.
Новичок: Я небоскрёб собираюсь строить. Хочу узнать, из какого дерева делать перекрытия между этажами!
Старожил: Какое дерево? Ты вообще соображаешь, что говоришь?
Новичок: Чем мне нравиться этот форум — из двух ответов ниодного конкретного. Одни вопросы неподелу!
Старожил: Не нравится — тебя здесь никто не держит. Но если ты не соображаешь, что из дерева небоскрёбы не строят, то лучше бы тебе сначала школу закончить.
Новичок: Не знаите — лучше молчите! У меня дедушка в деревянном доме живёт! У НЕГО НИЧЕГО НЕ ЛОМАЕТСЯ.
Но у него дом из сосны, а я понимаю, что для небоскрёба нужно дерево прочнее! Поэтому и спрашиваю. А от вас нормального ответа недождёшся.
Прохожий: Самое крепкое дерево — дуб. Вот тебе технология вымачивания дуба в солёной воде, она придаёт дубу особую прочность:
Новичок: Спасибо, братан! То что нужно.
Отредактировано модератором: Uchkuma, 26 Апреля, 2011 — 10:21:12
Источник
PHP, html_entity_decode и htmlspecialchars_decode не будут работать
Угу, PHP мне никогда не нравился, он такой «нечистый» .
Теперь мне нужно его использовать, и у меня с ним проблема: в основном, ни html_entity_decode , ни htmlspecialchars_decode у меня не работают. Я просмотрел этот форум и ничего. Вроде везде работает, только тут не сработает .
Я отправляю название фильма в базу данных, все закодировано, а затем, когда я получаю его из БД, я декодирую его следующим образом:
Это часть объекта JSON, который я создаю с помощью PHP. Хотя когда я смотрю на свойства этого конкретного объекта, его заголовок не декодируется, на самом деле вообще ничего не меняется. Я пробовал обе функции, как указано в заголовке вопроса, и пробовал кодировать, например UTF-8, а также некоторые параметры, такие как ENT_QUOTES или ENT_COMPAT, но это все равно не сработает.
Может кто-нибудь сказать мне, почему, черт возьми, PHP не подчиняется мне?
Изменить: вот все, что я там делаю:
Извините, это немного запутано, в блокноте ++ выглядит лучше; / Я на самом деле вывожу его в теге сценария, чтобы создать объект, и я посмотрел на json_encode и не совсем понял, как он может мне помочь, потому что я не знаю, как бы мне использовать с таким количеством переменных, извините.
Кроме того, вот код из источника после создания тега с javascript с использованием переменных из этого объекта JSON:
3 ответа
(Я не мог поместить это в комментарий, так что это должен быть ответ.)
Настоящая проблема здесь в том, как данные помещаются в вашу базу данных. Давайте посмотрим на приведенный вами образец строки:
Итак, пользовательский ввод был O.S.T.R «Track # 12»
Ключевой концепцией здесь является то, что именно так он должен был храниться в базе данных. Потому что это реальные данные. Не храните измененные версии в своей базе данных. Вместо этого экранируйте данные соответствующим образом, поскольку вам нужно их вывести.
Вот образцы данных, которые я буду использовать для следующих нескольких примеров:
Итак, когда вы записываете данные в операторе SQL, вы используете addslashes (или подготовленные операторы, но здесь я покажу подход с добавлением косых черт):
Для кодировки json используйте json_encode:
Для кодирования в формате csv в файле журнала используйте fputcsv:
Для вывода в формате HTML используйте htmlspecialchars () (или html_entity_encode ()):
Теперь, возможно, я все еще не убедил вас, и вы все еще действительно хотите хранить данные, готовые к HTML, в своей базе данных и терпеть дополнительный шаг, чтобы удалить их из HTML каждый раз, когда вы хотите использовать их для чего-то еще? В этом случае ваша примерная строка должна выглядеть так:
В то время как ваша строка выглядела так:
Вы видите разницу? В первом html-объекты были закодированы ровно один раз. Вызов html_entity_decode() декодирует его правильно. Во втором они закодированы дважды. Он больше не кодируется как html-объекты. Это то, что мы будем называть форматом с двойным кодированием или для краткости DEEF. Нет функции deef_decode() ни в PHP, ни в каком-либо другом компьютерном языке, о котором я когда-либо слышал, даже более чистом, чем PHP. Причина в том, что эта функция никому не нужна.
РЕЗЮМЕ: у вас есть ошибка в вашем коде, который записывает в их базу данных. Вы получаете строки с уже закодированными объектами, но вы снова кодируете их перед записью в базу данных.
ЗАКЛЮЧЕНИЕ: возвращаясь к ключевой концепции , которую я дал выше, вы должны декодировать эти html-объекты перед записью их в базу данных, а не кодировать их во второй раз. НО, когда вы вносите это изменение, убедитесь, что весь код, который берет данные из базы данных и помещает их в HTML или XML, знает, что теперь он должен кодировать сущности.
Я не совсем уверен, в чем проблема, но мне интересно, почему вы не используете json_encode() построить объект?
Это позаботится обо всех проблемах с кодированием.
Хорошо, если у кого-то такая же проблема и он сам не поймет эту чушь, решение простое, функции PHP html_entity_decode и htmlspecialchars_decode не удаляют строку полностью из специальных символов, он удаляет ее только из одного специального символа, если вы есть два специальных символа, вам нужно запустить эту функцию дважды . например, эта строка:
O.S.T.R "Track #12"
Нужно дважды зачистить, сначала убрать &, а затем в другой раз убрать эти «-es».
Источник
htmlspecialchars — проблема с php htmlspecialchars_decode ()
У меня есть небольшая проблема. мне нужно получить htmlspecialchars_decode бежать непосредственно перед тем, как $CmdExe = ‘nircmd работает так, как он мешает, поскольку он не будет выполняться должным образом. Так что в основном мне нужно $PlayMovie чтобы уже иметь декодированное значение, прежде чем продолжить. Как я могу сделать эту работу? Я использую php desktop и nircmd выполняет функции на ПК по мере необходимости. Это прекрасно работает, пока имя не имеет специального символа в базе данных, таких как ‘ , Все специальные символы, которые помещаются в базу данных с помощью htmlspecialchars , nircmd все еще видит недекодированное значение, поэтому мне нужно их декодировать, прежде чем оно попадет в эту строку. Или это уже расшифровано? Я спрашиваю, потому что, когда я проверяю $PlayMovie переменная без закодированных значений работает нормально. Необычный вопрос, который я знаю, однако мои php-навыки все еще находятся на начальной стадии. Очень ценится заранее.
После дальнейшего тестирования, когда я делаю str_replace оно работает. Так и есть htmlspecialchars_decode не работает?
Решение
В процессе, который вы используете, вставляя вывод базы данных в объявление php, вы должны экранировать qoute, пока он не достигнет. было бы странно, что строка подстановки будет работать в объявлении, так как другие части после одинарной кавычки попадут в зону php и вызовут какую-то синтаксическую ошибку. Но если вам нужно сделать этот код выше, вы бы избежали его с символом обратной косой черты \ при преобразовании одинарной кавычки.
так что измени это:
тогда эта строка будет работать, потому что в php экранирована одинарная кавычка, но модификатор будет удален, когда php выполнит переменную. так же, как HTML-код.
Источник
htmlspecialchars_decode
(PHP 5 >= 5.1.0, PHP 7, PHP 8)
htmlspecialchars_decode — Преобразует специальные HTML-сущности обратно в соответствующие символы
Описание
Эта функция является антиподом htmlspecialchars() . Она преобразует специальные HTML-сущности обратно в соответствующие символы.
Конвертируемые сущности: & , » (когда ENT_NOQUOTES не установлена), ‘ (когда ENT_QUOTES установлена), и > .
Список параметров
Строка, которую надо преобразовать.
Битовая маска из одного или нескольких следующих флагов, которые указывают как обрабатывать кавычки и какие типы документов использовать. Значением по умолчанию является ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 .
| Имя константы | Описание |
|---|---|
| ENT_COMPAT | Преобразует двойные кавычки и пропускает одинарные. |
| ENT_QUOTES | Преобразует и двойные, и одинарные кавычки. |
| ENT_NOQUOTES | Не преобразует ни двойные, ни одинарные кавычки. |
| ENT_HTML401 | Обрабатывать код как HTML 4.01. |
| ENT_XML1 | Обрабатывать код как XML 1. |
| ENT_XHTML | Обрабатывать код как XHTML. |
| ENT_HTML5 | Обрабатывать код как HTML 5. |
Возвращаемые значения
Возвращает преобразованную строку.
Список изменений
| Версия | Описание |
|---|---|
| 8.1.0 | Значение по умолчанию параметра flags изменено с ENT_COMPAT на ENT_QUOTES | ENT_SUBSTITUTE . |
Примеры
Пример #1 Пример использования функции htmlspecialchars_decode()
echo htmlspecialchars_decode ( $str );
// обратите внимание, что в данном случае кавычки не будут преобразованы
echo htmlspecialchars_decode ( $str , ENT_NOQUOTES );
?>
Результат выполнения данного примера:
Смотрите также
- htmlspecialchars() — Преобразует специальные символы в HTML-сущности
- html_entity_decode() — Преобразует HTML-сущности в соответствующие им символы
- get_html_translation_table() — Возвращает таблицу преобразований, используемую функциями htmlspecialchars и htmlentities
User Contributed Notes 8 notes
The example for «htmlspecialchars_decode()» below sadly does not work for all PHP4 versions.
Quote from the PHP manual:
«get_html_translation_table() will return the translation table that is used internally for htmlspecialchars() and htmlentities().»
But it does NOT! At least not for PHP version 4.4.2.
This was already reported in a bug report (http://bugs.php.net/bug.php?id=25927), but it was marked as BOGUS.
Proof:
Code:
———————
( get_html_translation_table ( HTML_SPECIALCHARS , ENT_QUOTES ));
var_dump ( htmlspecialchars ( ‘\» , ENT_QUOTES ));
?>
———————
This comment now is not to report this bug again (though I really believe it is one), but to complete the example and warn people of this pitfall.
To make sure your htmlspecialchars_decode fake for PHP4 works, you should do something like this:
function htmlspecialchars_decode ( $string , $style = ENT_COMPAT )
<
$translation = array_flip ( get_html_translation_table ( HTML_SPECIALCHARS , $style ));
if( $style === ENT_QUOTES )< $translation [ ''' ] = '\'' ; >
return strtr ( $string , $translation );
>
?>
Br, Thomas
This should be the best way to do it.
(Reposted because the other one seems a bit slower and because those who used the code under called it htmlspecialchars_decode_php4)
if ( ! function_exists ( ‘htmlspecialchars_decode’ ) )
<
function htmlspecialchars_decode ( $text )
<
return strtr ( $text , array_flip ( get_html_translation_table ( HTML_SPECIALCHARS )));
>
>
that works also with ä and » and so on.
get_html_translation_table(HTML_ENTITIES) => offers more characters than HTML_SPECIALCHARS
function htmlspecialchars_decode_PHP4($uSTR)
<
return strtr($uSTR, array_flip(get_html_translation_table(HTML_ENTITIES, ENT_QUOTES)));
>
Keep in mind that you should never trust user input — particularly for «mixed-bag» input containing a combination of plain text and markup or scripting code.
Well, consider someone sending ‘&’ to your PHP script:
= «&» ;
$var = ( htmlspecialchars_decode ( $var ) == $var ) ? htmlspecialchars ( $var ) : $var ;
echo $var ;
?>
Since ‘&’ decodes into ‘&’, (htmlspecialchars_decode($var) == $var) will be -false-, thus returning $var without that it’s escaped. In consequence, the script-tags are untouched, and you’ve just opened yourself to XSS.
There is, unfortunately, no reliable way to determine whether HTML is escaped or not that does not come with this caveat that I know of. Rather than try and catch the case ‘I’ve already encoded this’, you are better off avoiding double-escaping by simply escaping the HTML as close to the actual output as you can muster, e.g. in the view in an MVC development structure.
If you use `htmlspecialchars()` to change things like the ampersand (&) into it’s HTML equivalent (&), you might run into a situation where you mistakenly pass the same string to the function twice, resulting in things appearing on your website like, as I call it, the ampersanded amp; «&». Clearly nobody want’s «&» on his or her web page where there is supposed to be just an ampersand. Here’s a quick and easy trick to make sure this doesn’t happen:
= «This is a string that could be passed to htmlspecialchars multiple times.» ;
if ( htmlspecialchars_decode ( $var ) == $var ) <
$var = htmlspecialchars ( $var );
>
?>
Now, if your dealing with text that is a mixed bag (has HTML entities and non-HTML entities) you’re on your own.
[Update of previous note, having noticed I forgot to put in quote style]
PHP4 Compatible function:
function htmlspecialchars_decode_php4 ( $str , $quote_style = ENT_COMPAT ) <
return strtr ( $str , array_flip ( get_html_translation_table ( HTML_SPECIALCHARS , $quote_style )));
>
$var = ( htmlspecialchars_decode ( $var ) == $var ) ? htmlspecialchars ( $var ) : $var ;
echo $var ; // outputs Blue & yellow make green.
// you can do it a bunch of times, it still won’t screw you!
$var = ( htmlspecialchars_decode ( $var ) == $var ) ? htmlspecialchars ( $var ) : $var ;
$var = ( htmlspecialchars_decode ( $var ) == $var ) ? htmlspecialchars ( $var ) : $var ;
echo $var ; // still outputs Blue & yellow make green.
?>
Put it in a function. Add it to the method of some abstract data class.
For PHP4 Compatibility:
function htmlspecialchars_decode_php4 ( $str ) <
return strtr ( $str , array_flip ( get_html_translation_table ( HTML_SPECIALCHARS )));
>
Источник