htmlentities — Преобразует символы в соответствующие HTML сущности.


Как избежать преобразования HTML-сущностей в http_build_query в Stack Overflow

Запретить преобразование сущностей HTML.

Пожалуйста, посмотрите на код ниже:

Хорошо, это работает. Но некоторые серверы дают мне такой вывод:

Итак, некоторые серверы лечат &curren как сущность HTML. Но я этого не хочу.

Как я могу избежать нежелательного преобразования сущностей HTML?

Решение

Решение простое.
Просто используйте htmlentities на выходе.

Другие решения

Проверьте свою версию PHP, так как:

PHP 5.3.1 (Поведение с ошибками) http_build_query НЕ экранирует&символ амперсанда, который соединяет параметры. Пример: user_ >

PHP 5.4+ http_build_query НЕ экранирует&символ амперсанда, который соединяет параметры. Пример: user_ >

Htmlentities — Преобразует символы в соответствующие HTML сущности.

(PHP 3, PHP 4, PHP 5)

htmlentities — Преобразует символы в соответствующие HTML сущности.

Описание string htmlentities ( string string [, int quote_style [, string charset]] )

Таблица 1. Константы quote_style

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

Поддержка необязательно аргумента quote_style была добавлена в PHP 4.0.3.

Начиная с PHP 4.3.0 поддерживаются следующие кодировки.

Таблица 2. Поддерживаемые кодировки

Кодировка Псевдонимы Описание
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.
BIG5 950 Традиционный китайский, применяется в основном на Тайване.
GB2312 936 Упрощенный китайский, стандартная национальная кодировка.
BIG5-HKSCS Расширенная Big5, применяемая в Гонг-Конге.
Shift_JIS SJIS, 932 Японская кодировка.
EUC-JP EUCJP Японская кодировка.

Замечание: Не перечисленные выше кодировки не поддерживаются, и вместо них применяется ISO-8859-1.

Для выполнения обратного преобразования используется функция html_entity_decode() .

Пример 1. Пример использования htmlentities()

= «A ‘quote’ is bold» ;

// выводит: A ‘quote’ is bold
echo htmlentities ( $str );

Кириллица и htmlentities/htmlspecialchars. Проблема с русскими символами

Иногда по невнимательности возникает такая проблема, что функция htmlentities конвертирует кириллические буквы в нечитаемую последовательность символов. Это значит, что Вы не указали кодировку, которую функция будет использовать при преобразовании строки в html-сущности.

Решается эта проблема очень легко — необходимо добавить в вызов функции третий параметр-кодировку. Чаще всего это строка ‘UTF-8’ или ‘cp1251’. Также Вы можете использовать функцию htmlspecialchars вместо htmlentities. Она работает таким же образом, но конвертирует меньший диапазон специальных символов. Не забывайте про кодировку, в htmlspecialchars также есть этот аргумент.

Приведем небольшой пример, при котором htmlentities/htmlspecialchars возвращают кракозябли вместо строки с кириллическими символами:

В результате на странице видим Ð�иÑ�иллиÑ�а вместо слова «Кириллица». После добавления двух параметров ENT_QUOTES и ‘UTF-8’, проблема исчезает:

Htmlentities — Преобразует символы в соответствующие HTML сущности.

В HTML некоторые символы имеют специальное значение и для сохранения своего значения должны быть преобразованы в HTML-сущности. Начиная с 3-ей версии в PHP для этого есть функция — htmlspecialchars(). Работает отлично, но проблема в том, что на преобразует весь html-документ. У меня возникла необходимость преобразования спец. символов только в части документа, а именно сохранение «внешнего вида» угловых скобок в примерах кода на html-страницах.

Ручной вариант: в исходном тексте документа в примерах писать ‘& lt ;’ или ‘& gt ;’ вместо угловых скобок. Наверняка есть какие-нибудь инструменты для таких замен, может даже online-сервисы. Вот простой рабочий пример сервиса:

Online-преобразование спец.символов в HTML-сущности во всем тексте

Ручная обработка меня не улыбает в силу субъективных причин. Вообщем я сочинил php-функцию, даже две :) Точнее, на другой день придумал второй вариант. Здесь приведу коды обоих вариантов. Если у вас есть идеи лучше, подскажите, буду признателен.

Итак, постановка задачи: заменить спец. символы на html-сущности только внутри тега . , учитывая что блоков «code» в документе может быть несколько.

Вариант 1

Принцип такой: регулярным выражением выбираем все куски кода из html-текста. Заменяем в них скобки на ‘& lt ;’ или ‘& gt ;’. Потом в основном тексте заменяем старый код новым. Учитываем смещение в основном тексте, которое получается в результате замены на бОльшее количество символов. В дальнейших заменах в тексте сдвигаемся на это значение. В строке 10 можно использовать упомянутую ранее функцию PHP:

Все просто, обратить внимание нужно только на учет сдвига в основном тексте.


Вариант 2

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

Пример работы функций

Создаем html-документ. В исходном тексте документа теги пишем, как полагается. Любая из описанных функций вызывается перед тем, как отдать страницу браузеру.

Подаем текст в функцию. В браузерe получим:

Первый пример.

Второй пример.

Понравилась статья? Расскажите о ней друзьям:

Почему не преобразовываются html сущности через html_entity_decode?

Ребят, привет!
Прошу помощи! Очень сильно! Убил весь день, не могу понять что за фигня такая.

Суть проблемы!
Я сохраняю в базу данных скрытые поля автореспондера, дабы потом их использовать. При отправке формы, эти скрытые поля автореспондера проганяются через htmlentities дабы обезвредить код, затем происходит запись в БД. — Здесь все хорошо! Запись проходит, преобразование тоже.

НО! При обратном декодировании HTML сущности не преобразовываются, я использую функцию — html_entity_decode.

У меня есть возможность предпросмотра файла, в который эти данные будут записаны — проблема в том, что эти скрытые поля отображаются получается как обычный текст — вот что я получаю в исходном коде

А при записи этих данных в файл, естественно перед записью я прогоняю это все хозяйство через html_entity_decode — у меня получается в файле вот такое чудо

Ребят, как бороться с этим. Я вообще не могу понять что не так. :( Прошу помощи очень сильно.

Либо подскажите как HTML код сохранять лучше всего в базе данных, чтобы потом можно было его использовать.

htmlentities

htmlentities — Преобразует символы в соответствующие HTML сущности.

Описание

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

Подобно htmlspecialchars(), необязательный аргумент quote_style позволяет указать способ обработки ‘одиночных’ и «двойных» кавычек. Значением этого аргумента может быть одна из трех следующих констант (по умолчанию ENT_COMPAT):

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

Поддержка необязательно аргумента quote_style была добавлена в PHP 4.0.3.

Подобно htmlspecialchars(), необязательный третий аргумент charset определяет кодировку, используемую при преобразовании. Поддержка этого аргумента была добавлена в PHP 4.1.0. По умолчанию в настоящее время используется кодировка ISO-8859-1.

Начиная с PHP 4.3.0 поддерживаются следующие кодировки.

Поддерживаемые кодировки
Кодировка Псевдонимы Описание
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.
BIG5 950 Традиционный китайский, применяется в основном на Тайване.
GB2312 936 Упрощенный китайский, стандартная национальная кодировка.
BIG5-HKSCS Расширенная Big5, применяемая в Гонг-Конге.
Shift_JIS SJIS, 932 Японская кодировка.
EUC-JP EUCJP Японская кодировка.

Замечание: Не перечисленные выше кодировки не поддерживаются, и вместо них применяется ISO-8859-1.

Для выполнения обратного преобразования используется функция html_entity_decode().

Пример #1 Пример использования htmlentities()

// выводит: A ‘quote’ is bold
echo htmlentities ( $str );

// выводит: A ‘quote’ is bold
echo htmlentities ( $str , ENT_QUOTES );
?>

Коментарии

Note that you’ll have use htmlentities() before any other function who’ll edit text like nl2br().

If you use nl2br() first, the htmlentities() function will change to
.

htmlentites is a very handy function, but it fails to fix one thing which I deal with alot: word ‘smart’ quotes and emdashes.

The below function replaces the funky double quotes with «, funky single quotes with standard single quotes and fixes emdashes.

function CleanupSmartQuotes ( $text )
<
$badwordchars =array(
chr ( 145 ),
chr ( 146 ),
chr ( 147 ),
chr ( 148 ),
chr ( 151 )
);
$fixedwordchars =array(
«‘» ,
«‘» ,
‘»‘ ,
‘»‘ ,
‘—’
);
return str_replace ( $badwordchars , $fixedwordchars , $text );
>
?>

here the centralized version of htmlentities() for multibyte.

function mb_htmlentities ( $string )
<
$string = htmlentities ( $string , ENT_COMPAT , mb_internal_encoding ());
return $string ;
>

A version of the xml entities function below. This one replaces the «prime» character (′) with which I had difficulties.

// XML Entity Mandatory Escape Characters
function xmlentities ( $string ) <
return str_replace ( array ( ‘&’ , ‘»‘ , «‘» , ‘ , ‘>’ , ‘�’ ), array ( ‘&’ , ‘»‘ , »’ , ‘ , ‘>’ , »’ ), $string );
>
?>

This function will encode anything that is non Standard ASCII (that is, that is above #127 in the ascii table)


// allhtmlentities : mainly based on «chars_encode()» by Tim Burgan [http://www.php.net/htmlentities]
function allhtmlentities ( $string ) <
if ( strlen ( $string ) == 0 )
return $string ;
$result = » ;
$string = htmlentities ( $string , HTML_ENTITIES );
$string = preg_split ( «//» , $string , — 1 , PREG_SPLIT_NO_EMPTY );
$ord = 0 ;
for ( $i = 0 ; $i count ( $string ); $i ++ ) <
$ord = ord ( $string [ $i ]);
if ( $ord > 127 ) <
$string [ $i ] = ‘&#’ . $ord . ‘;’ ;
>
>
return implode ( » , $string );
>
?>

The data returned by a text input field is ready to be used in a data base query when enclosed in single quotes, e.g.
( «SELECT * FROM Article WHERE » );
?>
But you will get problems when writing back this data into the input field’s value,
echo » » ;
?>
because hmtl codes would be interpreted and escape sequences would cause strange output.

The following function may help:
function deescape ( $s , $charset = ‘UTF-8’ )
<
// don’t interpret html codes and don’t convert quotes
$s = htmlentities ( $s , ENT_NOQUOTES , $charset );

// delete the inserted backslashes except those for protecting single quotes
$s = preg_replace ( «/\\\\([^’])/e» , ‘»&#» . ord(«$1») . «;»‘ , $s );

// delete the backslashes inserted for protecting single quotes
$s = str_replace ( «\\'» , «&#» . ord ( «‘» ) . «;» , $s );

return $s ;
>
?>
Try some input like: a’b»c\d\’e\»f\\g&x#27;h to test .

unhtmlentities for all entities:

function unhtmlentities ( $string ) <
$trans_tbl1 = get_html_translation_table ( HTML_ENTITIES );
foreach ( $trans_tbl1 as $ascii => $htmlentitie ) <
$trans_tbl2 [ $ascii ] = ‘&#’ . ord ( $ascii ). ‘;’ ;
>
$trans_tbl1 = array_flip ( $trans_tbl1 );
$trans_tbl2 = array_flip ( $trans_tbl2 );
return strtr ( strtr ( $string , $trans_tbl1 ), $trans_tbl2 );
>

If you are building a loadvars page for Flash and have problems with special chars such as » & «, » ‘ » etc, you should escape them for flash:

Try trace(escape(«&»)); in flash’ actionscript to see the escape code for &;

function flashentities ( $string ) <
return str_replace (array( «&» , «‘» ),array( «%26» , «%27» ), $string );
>
?>

Those are the two that concerned me. YMMV.

I’ve seen lots of functions to convert all the entities, but I needed to do a fulltext search in a db field that had named entities instead of numeric entities (edited by tinymce), so I searched the tinymce source and found a string with the value->entity mapping. So, i wrote the following function to encode the user’s query with named entities.

The string I used is different of the original, because i didn’t want to convert ‘ or «. The string is too long, so I had to cut it. To get the original check TinyMCE source and search for nbsp or other entity ;)

= explode ( ‘,’ , ‘160,nbsp,161,iexcl,162,cent, [. ] ‘ );
$even = 1 ;
foreach( $entities_unmatched as $c ) <
if( $even ) <
$ord = $c ;
> else <
$entities_table [ $ord ] = $c ;
>
$even = 1 — $even ;
>

function encode_named_entities ( $str ) <
global $entities_table ;

$encoded_str = » ;
for( $i = 0 ; $i strlen ( $str ); $i ++) <
$ent = @ $entities_table [ ord ( $str < $i >)];
if( $ent ) <
$encoded_str .= «&$ent;» ;
> else <
$encoded_str .= $str < $i >;
>
>
return $encoded_str ;
>

I just thought I would add that if you’re using the default charset, htmlentities will not correctly return the trademark ( ™ ) sign.

Instead it will return something like this: �

If you need the trademark symbol, use:

( $html , ENT_QUOTES , «UTF-8» ); ?>

Trouble when using files with different charset?

htmlentities and html_entity_decode can be used to translate between charset!

function utf2latin ( $text ) <
$text = htmlentities ( $text , ENT_COMPAT , ‘UTF-8’ );
return html_entity_decode ( $text , ENT_COMPAT , ‘ISO-8859-1’ );
>
?>

Correction to my previous post: the set of ENTITY declarations must be inside a // Generate a list of entity declarations from the HTML_ENTITIES set that PHP knows about to dump into the document
function htmlentities_entities () <
$output = » ;
foreach ( get_html_translation_table_CP1252 ( HTML_ENTITIES ) as $value ) <
$name = substr ( $value , 1 , strlen ( $value ) — 2 );
switch ( $name ) <
// These ones we can skip because they’re built into XML
case ‘gt’ :
case ‘lt’ :
case ‘quot’ :
case ‘apos’ :
case ‘amp’ : break;
default: $output .= » \n» ;
>
>
$output .= «]>\n» ;
return( $output );
>

// ref: function.get-html-translation-table#76564
function get_html_translation_table_CP1252 ( $type ) <
$trans = get_html_translation_table ( $type );
$trans [ chr ( 130 )] = ‘‚’ ; // Single Low-9 Quotation Mark
$trans [ chr ( 131 )] = ‘ƒ’ ; // Latin Small Letter F With Hook
$trans [ chr ( 132 )] = ‘„’ ; // Double Low-9 Quotation Mark
$trans [ chr ( 133 )] = ‘…’ ; // Horizontal Ellipsis
$trans [ chr ( 134 )] = ‘†’ ; // Dagger
$trans [ chr ( 135 )] = ‘‡’ ; // Double Dagger
$trans [ chr ( 136 )] = ‘ˆ’ ; // Modifier Letter Circumflex Accent
$trans [ chr ( 137 )] = ‘‰’ ; // Per Mille Sign
$trans [ chr ( 138 )] = ‘Š’ ; // Latin Capital Letter S With Caron
$trans [ chr ( 139 )] = ‘‹’ ; // Single Left-Pointing Angle Quotation Mark
$trans [ chr ( 140 )] = ‘Œ’ ; // Latin Capital Ligature OE
$trans [ chr ( 145 )] = ‘‘’ ; // Left Single Quotation Mark
$trans [ chr ( 146 )] = ‘’’ ; // Right Single Quotation Mark
$trans [ chr ( 147 )] = ‘“’ ; // Left Double Quotation Mark
$trans [ chr ( 148 )] = ‘”’ ; // Right Double Quotation Mark
$trans [ chr ( 149 )] = ‘•’ ; // Bullet
$trans [ chr ( 150 )] = ‘–’ ; // En Dash
$trans [ chr ( 151 )] = ‘—’ ; // Em Dash
$trans [ chr ( 152 )] = ‘˜’ ; // Small Tilde
$trans [ chr ( 153 )] = ‘™’ ; // Trade Mark Sign
$trans [ chr ( 154 )] = ‘š’ ; // Latin Small Letter S With Caron
$trans [ chr ( 155 )] = ‘›’ ; // Single Right-Pointing Angle Quotation Mark
$trans [ chr ( 156 )] = ‘œ’ ; // Latin Small Ligature OE
$trans [ chr ( 159 )] = ‘Ÿ’ ; // Latin Capital Letter Y With Diaeresis
$trans [ ‘euro’ ] = ‘€’ ; // euro currency symbol
ksort ( $trans );
return $trans ;
>

?>

[EDIT BY danbrown AT php DOT net: The user’s original note contained the following text:

«So here’s something fun: if you create an XML document in PHP and use htmlentities() to encode text data, then later want to read and parse the same document with PHP’s xml_parse(), unless you include entity declarations into the generated document, the parser will stop on the unknown entities.

To account for this, I created a small function to take the translation table and turn it into XML definitions. I insert this output into the XML document immediately after the line and the parse errors magically vanish»
]

correction to my previous post and improvement of the function: (the post was changed by the html parser and the characters displays as they should not)

function XMLEntities ( $string )
<
$string = preg_replace ( ‘/[^\x09\x0A\x0D\x20-\x7F]/e’ , ‘_privateXMLEntities(«$0»)’ , $string );
return $string ;
>

function _privateXMLEntities ( $num )
<
$chars = array(
128 => ‘€’ ,
130 => ‘‚’ ,
131 => ‘ƒ’ ,
132 => ‘„’ ,
133 => ‘…’ ,
134 => ‘†’ ,
135 => ‘‡’ ,
136 => ‘ˆ’ ,
137 => ‘‰’ ,
138 => ‘Š’ ,
139 => ‘‹’ ,
140 => ‘Œ’ ,
142 => ‘Ž’ ,
145 => ‘‘’ ,
146 => ‘’’ ,
147 => ‘“’ ,
148 => ‘”’ ,
149 => ‘•’ ,
150 => ‘–’ ,
151 => ‘—’ ,
152 => ‘˜’ ,
153 => ‘™’ ,
154 => ‘š’ ,
155 => ‘›’ ,
156 => ‘œ’ ,
158 => ‘ž’ ,
159 => ‘Ÿ’ );
$num = ord ( $num );
return (( $num > 127 && $num 160 ) ? $chars [ $num ] : «&#» . $num . «;» );
>
?>

in the previous post, to correct the HEX values that are not rendered, the program use a for each cicle, but that introduces a mayor complexity in execution time, so, we use the ability to call functions in the preg_replace second parameter, and ceate another funcion that evaluates the ord of the character given, and if it is between 127 and 160 it returns the modified HEX value to be understood by the browser and not brake the XML
(this work with dynamic XML generated form php with dynamic data from any source)

p.d: the ‘&'(&) should appear in this post as a single ampersand character and not as the html entity

use htmlspecialchars() if you are passing in a usual ASCII string. It is faster than htmlentities().

For example, if you are just doing

then you can just use htmlspecialchars(). htmlentities() will look for all possible ways to convert string into html entities, such as © or é (which is e with an acute accent on top).

Note that ASCII is just 7 bit, which is 0x00 to 0x7F. htmlspecialchars() will handle characters inside this range already. htmlentities() is for the 8-bit Latin-1 (ISO-8859-1) to handle European characters, or for UTF-8 when the 3rd argument is «UTF-8» to handle UTF-8 characters, or other types of encodings using different values for the 3rd argument passed into htmlentities().

Note that as of 5.2.5 it appears that if the input string contains a character that is not valid for the output encoding you’ve specified, then this function returns null.

You might expect it to just strip the invalid char, but it doesn’t.

You can strip the chars yourself like so:

You can combine that with htmlentities also:


$str = htmlentities(iconv(‘UTF-8’, ‘UTF-8//IGNORE’, $str, ENT_QUOTES, ‘UTF-8’);

Should give you a string with htmlentities encoded to utf-8, and any unsupported chars stripped.

Had a heck of a time to get my rss entities right. using htmlentities didn’t work and using html_entity_decode didn’t work either. Ended up writing a custom function to encode and decode. It might still need some work but I thought to share it because I couldn’t find anything on the net. Always open for suggestions to improve it! Here it is:

= false ;
$entity_custom_to = false ;
function html_entity_decode_encode_rss ( $data ) <
global $entity_custom_from , $entity_custom_to ;
if(! is_array ( $entity_custom_from ) || ! is_array ( $entity_custom_to )) <
$array_position = 0 ;
foreach ( get_html_translation_table ( HTML_ENTITIES ) as $key => $value ) <
//print(«
key: $key, value: $value
\n»);
switch ( $value ) <
// These ones we can skip
case ‘ ‘ :
break;
case ‘>’ :
case ‘ :
case ‘»‘ :
case »’ :
case ‘&’ :
$entity_custom_from [ $array_position ] = $key ;
$entity_custom_to [ $array_position ] = $value ;
$array_position ++;
break;
default:
$entity_custom_from [ $array_position ] = $value ;
$entity_custom_to [ $array_position ] = $key ;
$array_position ++;
>
>
>
return str_replace ( $entity_custom_from , $entity_custom_to , $data );
>
?>

echo strtr ( ‘ěščřžýáíéúůďťňĚŠČŘŽÝÁÍÉÚŮĎŤŇ’ , $ent );
?>

If you want something simple that actually works, try this. Strips MS word and other entities and returns a clear data string:

//call this function

function DoHTMLEntities ( $string ) <
$trans_tbl [ chr ( 145 )] = ‘‘’ ;
$trans_tbl [ chr ( 146 )] = ‘’’ ;
$trans_tbl [ chr ( 147 )] = ‘“’ ;
$trans_tbl [ chr ( 148 )] = ‘”’ ;
$trans_tbl [ chr ( 142 )] = ‘é’ ;
$trans_tbl [ chr ( 150 )] = ‘–’ ;
$trans_tbl [ chr ( 151 )] = ‘—’ ;
return strtr ( $string , $trans_tbl );
>

//insert your string variable here

$foo = str_replace ( «\r\n\r\n» , «» , htmlentities ( $your_string ));
$foo2 = str_replace ( «\r\n» , » » , $foo );
$foo3 = str_replace ( » & » , «&» , $foo2 );
echo DoHTMLEntities ( $foo3 );
?>

under what circumstances would someone want a ntilde [ñ] to be converted into «Ã±» as htmlentities does?
the correct method of translation should return the accurate NCR for the multibyte unicode sequence
which in this case is ñ

//simple task: convert everything from utf-8 into an NCR[numeric character reference]
class unicode_replace_entities <
public function UTF8entities ( $content = «» ) <
$contents = $this -> unicode_string_to_array ( $content );
$swap = «» ;
$iCount = count ( $contents );
for ( $o = 0 ; $o $iCount ; $o ++) <
$contents [ $o ] = $this -> unicode_entity_replace ( $contents [ $o ]);
$swap .= $contents [ $o ];
>
return mb_convert_encoding ( $swap , «UTF-8» ); //not really necessary, but why not.
>

public function unicode_string_to_array ( $string ) < //adjwilli
$strlen = mb_strlen ( $string );
while ( $strlen ) <
$array [] = mb_substr ( $string , 0 , 1 , «UTF-8» );
$string = mb_substr ( $string , 1 , $strlen , «UTF-8» );
$strlen = mb_strlen ( $string );
>
return $array ;
>

public function unicode_entity_replace ( $c ) < //m. perez
$h = ord ( $c < 0 >);
if ( $h 0x7F ) <
return $c ;
> else if ( $h 0xC2 ) <
return $c ;
>

//utf-8 environment
$content = «baño baño baño日本語 = nihongo da ze.
» ;

$oUnicodeReplace = new unicode_replace_entities ();
$content = $oUnicodeReplace -> UTF8entities ( $content );
echo «
Result:
» ;
echo $content ;
$source = htmlentities ( $content );
echo «
htmlentities of resulting data:
» ;
echo $source ;

Note: Entities get replaced with ‘literals’ in textarea FF3

For editing NCR’s rather than ‘literals’ in a textarea

When happens that you want to encode special characters but not the HTML tags using this function you’ve two options:

a) Build your own function and go replace by character; eg.

for( $i = 0 ; $i strlen ( $string ); $i ++) <
switch( substr ( $string , $i , 1 )) <
//. A VERY HUGE switch here with all characters to encode.
>
>
?>

b) use this function and simple restore the html tags afterwards. Which gives you a 6 line function as follow:

function keephtml ( $string ) <
$res = htmlentities ( $string );
$res = str_replace ( » , » , $res );
$res = str_replace ( «>» , «>» , $res );
$res = str_replace ( «»» , ‘»‘ , $res );
$res = str_replace ( «&» , ‘&’ , $res );
return $res ;
>
?>

The following will make a string completely safe for XML:

function philsXMLClean ( $strin ) <
$strout = null ;

for ( $i = 0 ; $i strlen ( $strin ); $i ++) <
$ord = ord ( $strin [ $i ]);

I needed a simple little function to take a string and convert extended ascii characters into html entities. I couldn’t find a function for this so I whipped one up.

/* Convert Extended ASCII Characters to HTML Entities */
function ascii2entities ( $string ) <
for( $i = 128 ; $i 255 ; $i ++) <
$entity = htmlentities ( chr ( $i ), ENT_QUOTES , ‘cp1252’ );
$temp = substr ( $entity , 0 , 1 );
$temp .= substr ( $entity , — 1 , 1 );
if ( $temp != ‘&;’ ) <
$string = str_replace ( chr ( $i ), » , $string );
>
else <
$string = str_replace ( chr ( $i ), $entity , $string );
>
>
return $string ;
>

An important note below about using this function to secure your application against Cross Site Scripting (XSS) vulnerabilities.

When printing user input in an attribute of an HTML tag, the default configuration of htmlEntities() doesn’t protect you against XSS, when using single quotes to define the border of the tag’s attribute-value. XSS is then possible by injecting a single quote:

[ ‘a’ ] = «#000′ onload=’alert(document.cookie)» ;
?>

XSS possible (insecure):

= htmlEntities ( $_GET [ ‘a’ ]);
print » » ; # results in:
?>

Use the ‘ENT_QUOTES’ quote style option, to ensure no XSS is possible and your application is secure:

= htmlEntities ( $_GET [ ‘a’ ], ENT_QUOTES );
print » » ; # results in:
?>

The ‘ENT_QUOTES’ option doesn’t protect you against javascript evaluation in certain tag’s attributes, like the ‘href’ attribute of the ‘a’ tag. When clicked on the link below, the given JavaScript will get executed:

[ ‘a’ ] = ‘javascript:alert(document.cookie)’ ;
$href = htmlEntities ( $_GET [ ‘a’ ], ENT_QUOTES );
print «link» ; # results in: link
?>

I use this function to encode all the xml entities and also all the &something; that are not defined in xml like ™
You can also decode what you encode with my decode function.
My function works a little like the htmlentities.
You can also add other string to the array if you want to exclude them from the encoding.

function xml_entity_decode ( $text , $charset = ‘Windows-1252’ ) <
// Double decode, so if the value was ™ it will become Trademark
$text = html_entity_decode ( $text , ENT_COMPAT , $charset );
$text = html_entity_decode ( $text , ENT_COMPAT , $charset );
return $text ;
>

function xml_entities ( $text , $charset = ‘Windows-1252’ ) <
// Debug and Test
// $text = «test & ™ ™ abc ® ® -«;

// First we encode html characters that are also invalid in xml
$text = htmlentities ( $text , ENT_COMPAT , $charset , false );

// XML character entity array from Wiki
// Note: ‘ is useless in UTF-8 or in UTF-16
$arr_xml_special_char = array( «»» , «&» , «‘» , » , «>» );

// Building the regex string to exclude all strings with xml special char
$arr_xml_special_char_regex = «(?» ;
foreach( $arr_xml_special_char as $key => $value ) <
$arr_xml_special_char_regex .= «(?!$value)» ;
>
$arr_xml_special_char_regex .= «)» ;

// Scan the array for &something_not_xml; syntax
$pattern = «/$arr_xml_special_char_regex&([a-zA-Z0-9]+;)/» ;


// Replace the &something_not_xml; with &something_not_xml;
$replacement = ‘&$<1>‘ ;
return preg_replace ( $pattern , $replacement , $text );
>
?>

A pointer to function.mb-convert-encoding if your intention is to translate *all* characters in a charset to their corresponding HTML entities, not just named characters. Non-named characters will be replaced with HTML numeric encoding. eg:

$text = mb_convert_encoding($text, ‘HTML-ENTITIES’, «UTF-8»);

=array( «quot» , «amp» , «apos» , «lt» , «gt» , «nbsp» , «iexcl» , «cent» ,
«pound» , «curren» , «yen» , «brvbar» , «sect» , «uml» , «copy» , «ordf» , «laquo» ,
«not» , «shy» , «reg» , «macr» , «deg» , «plusmn» , «sup2» , «sup3» , «acute» ,
«micro» , «para» , «middot» , «cedil» , «sup1» , «ordm» , «raquo» , «frac14» ,
«frac12» , «frac34» , «iquest» , «Agrave» , «Aacute» , «Acirc» , «Atilde» , «Auml» ,
«Aring» , «AElig» , «Ccedil» , «Egrave» , «Eacute» , «Ecirc» , «Euml» , «Igrave» ,
«Iacute» , «Icirc» , «Iuml» , «ETH» , «Ntilde» , «Ograve» , «Oacute» , «Ocirc» ,
«Otilde» , «Ouml» , «times» , «Oslash» , «Ugrave» , «Uacute» , «Ucirc» , «Uuml» ,
«Yacute» , «THORN» , «szlig» , «agrave» , «aacute» , «acirc» , «atilde» , «auml» ,
«aring» , «aelig» , «ccedil» , «egrave» , «eacute» , «ecirc» , «euml» , «igrave» ,
«iacute» , «icirc» , «iuml» , «eth» , «ntilde» , «ograve» , «oacute» , «ocirc» ,
«otilde» , «ouml» , «divide» , «oslash» , «ugrave» , «uacute» , «ucirc» , «uuml» ,
«yacute» , «thorn» , «yuml» , «OElig» , «oelig» , «Scaron» , «scaron» , «Yuml» ,
«fnof» , «circ» , «tilde» , «Alpha» , «Beta» , «Gamma» , «Delta» , «Epsilon» ,
«Zeta» , «Eta» , «Theta» , «Iota» , «Kappa» , «Lambda» , «Mu» , «Nu» , «Xi» ,
«Omicron» , «Pi» , «Rho» , «Sigma» , «Tau» , «Upsilon» , «Phi» , «Chi» , «Psi» ,
«Omega» , «alpha» , «beta» , «gamma» , «delta» , «epsilon» , «zeta» , «eta» ,
«theta» , «iota» , «kappa» , «lambda» , «mu» , «nu» , «xi» , «omicron» , «pi» ,
«rho» , «sigmaf» , «sigma» , «tau» , «upsilon» , «phi» , «chi» , «psi» , «omega» ,
«thetasym» , «upsih» , «piv» , «ensp» , «emsp» , «thinsp» , «zwnj» , «zwj» , «lrm» ,
«rlm» , «ndash» , «mdash» , «lsquo» , «rsquo» , «sbquo» , «ldquo» , «rdquo» ,
«bdquo» , «dagger» , «Dagger» , «bull» , «hellip» , «permil» , «prime» , «Prime» ,
«lsaquo» , «rsaquo» , «oline» , «frasl» , «euro» , «image» , «weierp» , «real» ,
«trade» , «alefsym» , «larr» , «uarr» , «rarr» , «darr» , «harr» , «crarr» , «lArr» ,
«uArr» , «rArr» , «dArr» , «hArr» , «forall» , «part» , «exist» , «empty» , «nabla» ,
«isin» , «notin» , «ni» , «prod» , «sum» , «minus» , «lowast» , «radic» , «prop» ,
«infin» , «ang» , «and» , «or» , «cap» , «cup» , «int» , «there4» , «sim» , «cong» ,
«asymp» , «ne» , «equiv» , «le» , «ge» , «sub» , «sup» , «nsub» , «sube» , «supe» ,
«oplus» , «otimes» , «perp» , «sdot» , «lceil» , «rceil» , «lfloor» ,
«rfloor» , «lang» , «rang» , «loz» , «spades» , «clubs» , «hearts» , «diams» );

// The selection of tags below is optimized for use with a webmaster’s database,
// —NOT— to process user POSTs from the World Wide Web
// for inclusion on a public page.

// NOT included:
// form, input, select, option, label, optgroup, textarea, area, map,
// html, head, style, link, meta, base, body, isindex,
// frame, frameset, noframes
// (include those above at your wish, remove those below at your wish)
$HTML_TAGS =array( «a» , «abbr» , «acronym» , «address» , «applet» , «b» , «basefont» ,
«bdo» , «big» , «blockquote» , «br» , «button» , «caption» , «center» , «cite» ,
«code» , «col» , «colgroup» , «dd» , «del» , «dfn» , «dir» , «div» , «dl» , «dt» , «em» ,
«embed» , «fieldset» , «font» , «h1» , «h2» , «h3» , «h4» , «h5» , «h6» , «hr» , «i» ,
«iframe» , «img» , «ins» , «kbd» , «legend» , «li» , «menu» , «noembed» , «noscript» ,
«object» , «ol» , «p» , «param» , «pre» , «q» , «s» , «samp» , «script» , «small» ,
«span» , «strike» , «strong» , «sub» , «sup» , «table» , «tbody» , «td» , «tfoot» ,
«th» , «thead» , «title» , «tr» , «tt» , «u» , «ul» , «var» );

$Xchars = array(
128 => ‘€’ ,
130 => ‘‚’ ,
131 => ‘ƒ’ ,
132 => ‘„’ ,
133 => ‘…’ ,
134 => ‘†’ ,
135 => ‘‡’ ,
136 => ‘ˆ’ ,
137 => ‘‰’ ,
138 => ‘Š’ ,
139 => ‘‹’ ,
140 => ‘Œ’ ,
142 => ‘Ž’ ,
145 => ‘‘’ ,
146 => ‘’’ ,
147 => ‘“’ ,
148 => ‘”’ ,
149 => ‘•’ ,
150 => ‘–’ ,
151 => ‘—’ ,
152 => ‘˜’ ,
153 => ‘™’ ,
154 => ‘š’ ,
155 => ‘›’ ,
156 => ‘œ’ ,
158 => ‘ž’ ,
159 => ‘Ÿ’ );
?>

Замена HTML-сущностей в строке

Как сделать так, чтобы символы » были заменены на «

2 ответа 2

html_entity_decode() является противоположностью функции htmlentities() . Она преобразует все HTML-сущности в строке string в соответствующие символы.

Если быть точнее, то эта функция преобразует все сущности (в том числе все числовые сущности), которые а) обязательно верны для выбранного типа документа — то есть, для XML, эта функция не преобразует именованные сущности, которые могут быть определены в каком-нибудь DTD — и б) их символы находятся в кодировке соответвующей с выбранной кодировкой и разрешены в выбранном типе документа. Все другие сущности остаются без изменений. набор, связанный с выбранной кодировкой и разрешается в выбранном тип документа. Все другие субъекты, которые оставили как есть.

Htmlentities() против htmlspecialchars()

В чем разница между htmlspecialchars() и htmlentities() . Когда я должен использовать один или другой?

Из документации PHP для htmlentities:

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

Из документации PHP для htmlspecialchars:

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

Разница в том, что кодируется. Возможные варианты: все (сущности) или «специальные» символы, такие как амперсанд, двойные и одинарные кавычки, меньше и больше (спецчары).

Я предпочитаю использовать htmlspecialchars всякий раз, когда это возможно.

Если нет необходимости кодировать все символы, имеющие свои эквиваленты HTML.

Если вы знаете, что кодировка страницы соответствует текстовым специальным символам, зачем использовать htmlentities ? htmlspecialchars является очень простым, и выдает меньше кода для отправки клиенту.

Второй вариант короче и не вызывает проблем, если установлена ​​кодировка ISO-8859-1.

Когда данные будут обрабатываться не только через браузер (чтобы избежать декодирования HTML-объектов),

  • Иногда вы пишете XML-данные, и вы не можете использовать HTML-объекты в XML файле.
  • Потому что htmlentities заменяет больше символов, чем htmlspecialchars . Это необязательно, делает PHP скрипт менее эффективным, а полученный HTML-код менее читабельным.

htmlentities необходимо, только если ваши страницы используют кодировки, такие как ASCII или LATIN-1 вместо UTF-8, и вы обрабатываете данные с кодировкой, отличной от страницы.

Это кодируется htmlentities .

implode( «\t», array_values( get_html_translation_table( HTML_ENTITIES ) ) ) :

«& <>
¢ ¤ ¤ ¦ ¦ ¦ ¨ ª ± ± ± ´ ± ± ± µ º µ µ ½ ½ ½ À À À À À Ã Ã Å Å É É Ì Í Í Î Î Î Ð Î Î Ð Ð Ñ Ñ Ð Ð Ð Ð Ð Ð × Õ Ö × Ù Ú Û Û Û Û ß ß ß ß ã ç ç ç ç ç ë ë ì ì ì ï ï ò ò õ õ ü û ü œ Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š Š. Α Β Γ Δ Ε Ζ Η Θ Ι Λ Λ Μ Ν Ξ Ο Π Σ Σ Τ Υ Φ β Ω Ψ β α β γ γ γ β η η θ ι ι λ μ μ ω ϑ ϒ ϖ ‌ ‍ — — — — „„ • • ‹‹ ‹‹ ‹‹ ‹‹ ℵ ℵ ℵ ℵ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ∉ ∉ ∉ ∉ ∑ ∏ ∑ — ∗ √ ∞ ∞ ∧ ∩ ∩ ∪ ∪ ∴ ≈ ≈ ≈ ≡ ≤ ≤ ≥ ≥ ⊄ ⊆ ⊇ ⊥ ⋅ ♦ ♦ ♦ ♦ ♦ ♦ ♦

Это кодируется с помощью htmlspecialchars .

implode( «\t», array_values( get_html_translation_table( HTML_SPECIALCHARS ) ) ) :

Вы должны использовать htmlspecialchars($strText, ENT_QUOTES) , когда вы просто хотите, чтобы ваша строка была безопасна для XML и HTML:

Однако, если у вас также есть дополнительные символы Unicode или необычные символы в тексте, вы должны использовать htmlentities() для обеспечения они отображаются правильно на вашей странице HTML.

  • будет кодироваться только с помощью htmlspecialchars() в & # 039; если опция ENT_QUOTES передана. & # 039; более безопасно использовать затем & поскольку более старые версии Internet Explorer не поддерживают & apos; юридическое лицо.
  • Технически, > не требует кодирования в соответствии со спецификацией XML, но он обычно кодируется также для согласованности с требованием

Я только что узнал о get_html_translation_table . Вы передаете его HTML_ENTITIES или HTML_SPECIALCHARS , и он возвращает массив с символами, которые будут закодированы и как они будут закодированы.

htmlspecialchars () делает минимальный размер кодировки, чтобы убедиться, что ваша строка не анализируется как HTML. Это оставляет вашу строку более понятной для человека, чем если бы вы использовали htmlentities () для кодирования абсолютно всего, что имеет кодировку.

htmlentities — преобразовать все применимые символы в объекты HTML.

htmlspecialchars — Преобразование специальных символов в объекты HTML.

Перевод выполненных символов перевода ниже:


  • ‘&’ (амперсанд) становится «&»;
  • ‘»‘ (двойная кавычка) становится ‘»‘ когда ENT_NOQUOTES не установлен.
  • «» (одинарная кавычка) становится ‘& # 039;’ (или ‘) только при установке ENT_QUOTES.
  • ‘ ‘ (больше) становится ‘& gt;’

Вы можете проверить следующий код для получения дополнительной информации о том, какие htmlentities и htmlspecialchars:

Вероятно, вы хотите использовать кодировку символов Unicode, например UTF-8 и htmlspecialchars. Потому что нет необходимости генерировать «HTML-сущности» для «всех [применимых символов» (то есть, что htmlentities делает в соответствии с документацией), если это уже в вашем наборе символов.

Один маленький пример: мне нужно было иметь 2 имени клиента, индексированные в функции:

Я изначально $term = get_term_by(‘name’, htmlentities($name), ‘client’); , в результате чего были названы имена терминов, которые включали элемент массива амперсанда (&), но не акцентированный элемент. Но когда я изменил значение переменной на htmlspecialchars , оба смогли запустить функцию. Надеюсь, это поможет!

Не полностью, PLS отслеживать ссылку для полного документа.

Различия между htmlspecialchars() и htmlentities() очень малы. Давайте посмотрим несколько примеров:

htmlspecialchars (строка $ string) принимает несколько аргументов, где первый аргумент является строкой, а все остальные аргументы (определенные флаги, определенные кодировки и т.д.) являются необязательными. htmlspecialchars преобразует специальные символы в строке в объекты HTML. Например, если у вас есть в строке, htmlspecialchars преобразует его в & л; b & gt; , В то время как такие символы, как µ † и т.д., Не имеют особого значения в HTML. Таким образом, они не будут преобразованы в объекты HTML с помощью функции htmlspecialchars, как показано в следующем примере.

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

html_entity_decode()

Синтаксис:

html_entity_decode (string [, quote_style[, charset]] )

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

Описание функции:

Функция html_entity_decode преобразует символы (HTML сущности) в HTML теги . Функция обратная htmlentities()

Обязательный аргумент. Строка с данными для преобразования

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

ENT_COMPAT — конвертируются двойные кавычки, а одинарные остаются без изменений (используется по умолчанию);

ENT_QUOTES — конвертируются двойные и одинарные кавычки;

ENT_NOQUOTES — любые кавычки не конвертируются;

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

ISO-8859-1, ISO-8859-15, UTF-8, cp866, cp1251, cp1252, KOI8-R, BIG5, GB2312, BIG5-HKSCS, Shift_JIS, EUC-JP

Если ни одна из выше перечисленных кодировок не поддерживаются, то по умолчанию применяется ISO-8859-1 (с версии 5.4, до этого использовалась кодировка UTF-8

string

Примеры:

Пример 1:

print html_entity_decode(«это жирный текст»);
?>

Как преобразовать символ валюты в соответствующие HTML сущности

Как я могу преобразовать € (или любой другой символ валюты) к соответствующему HTML сущности.

Я использую .Net 4.6.1

HtmlEncode смотрит только на несколько специальных символов и заменяет их жестко закодированных значений, и дополнительно еще несколько символов ASCII высокой (160 — 255) , как описано здесь . Единственный способ кодирования в имена сущностей является указанием их вручную. Я дал ему шанс , и построил обертки вокруг System.Net.WebUtility класса , используя при этом существующие объекты Html DataSet используют .NET для декодирования, а так , что декодирование продолжает работать с этим решением. Я принимал его на GitHub: WebUtilityWrapper . Вы можете использовать его , как показано ниже:

Я тестировал его с помощью кодирования и декодирования обратно, а затем проверка, если мы получим исходную строку для большого набора символов Юникода. Разделяя еще несколько тестов:

HtmlEncode () Ответ с использованием HTMLEncode фреймворки: ( ссылка )

HtmlEncode () Ответ с помощью WebUtilityWrapper.HtmlEncode:

Надеюсь это поможет!

HtmlEncode и HtmlDecode не симметричны.

HtmlEncode будет кодировать только несколько специальных символов:

и для некоторых Юникода символов будет преобразовывать их в &# ; формат.

Таким образом, никаких преобразований в HtmlEntities не происходит.

Илон Маск рекомендует:  Статьи о движках сайтов
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL