Превращение символьных сущностей HTML в «обычные» буквы ... почему это работает только частично? - PullRequest
1 голос
/ 02 марта 2010

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

   <?php $code = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $code);
   $code = preg_replace('~&#([0-9]+);~e', 'chr("\\1")', $code); 
   $code = html_entity_decode($code); ?>

Однако экспортированный код по-прежнему выглядит так:

progid:DXImageTransform.Microsoft.AlphaImageLoader(src=’img/the_image.png’);

Видишь, что там происходит? Сколько еще вещей я могу запустить в строке, чтобы превратить их в чертовски обычные символы?!

Спасибо!

Jack

Ответы [ 4 ]

4 голосов
/ 02 марта 2010

’ - это то, что вы получаете, когда читаете кодированный символ UTF-8 (ПРАВИЛЬНАЯ ОДНОКВАЖНАЯ КВАРТАЦИЯ, U + 2019), как если бы он был закодирован как windows-1252. Другими словами, у вас есть две проблемы: вы используете неправильную кодировку для чтения неправильного символа.

Значения атрибутов HTML должны быть заключены в апострофы или кавычки ASCII, а не в кавычки. Числовые объекты, которые вы конвертируете, должны быть &#39; или &#x27 (апостроф) или &#34; или &#x22; (кавычка). Вместо этого у вас, кажется, есть &#146;, который представляет тот же символ, что и &#x2019;, &#8217 или &rsquo;.

Что касается второй проблемы, то результирующий текст кажется закодированным как UTF-8, но в какой-то момент он читается так, как будто это windows-1252. В UTF-8 символ представлен трехбайтовой последовательностью E2 80 99, но windows-1252 преобразует каждый байт отдельно, в â, и . Где бы это ни происходило, этого нет в коде, который вы нам показали.

Хорошей новостью является то, что ваш preg_replace код, кажется, работает правильно. ;) Но я думаю, что другие правы, когда говорят, что вы можете использовать html_entity_decode() в одиночку для этой части.

0 голосов
/ 02 марта 2010

chr работает только в ASCII, поэтому ваши символы, не входящие в ASCII, запутались. Если только я неправильно понимаю, что вы пытаетесь сделать, вам просто нужен один вызов html_entity_decode () с правильным параметром charset и вы можете избавиться от двух других строк.

0 голосов
/ 02 марта 2010

Хотя имя не отражает его, html_entity_decode также преобразует числовые ссылки на символы.

// α (U+03B1) == 0xCEB1 (UTF-8)
var_dump("\xCE\xB1" == html_entity_decode('&#x03B1;', ENT_COMPAT, 'UTF-8'));
0 голосов
/ 02 марта 2010

Возможно, вы используете кодировку символов, отличную от вашей страницы, ISO v.s. UTF-8, например.

...