Превращение объектов персонажа HTML в «обычные» буквы ... почему он работает только частично?

StackOverflow https://stackoverflow.com/questions/2359356

Вопрос

Я использую все приведенное ниже, чтобы взять поле, называемое «код» из моей базы данных, избавьтесь от всех объектов 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’);

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

Спасибо!

Джек

Это было полезно?

Решение

’ это то, что вы получаете, когда читаете кодированный персонаж 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() один для этой части.

Другие советы

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

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

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

// α (U+03B1) == 0xCEB1 (UTF-8)
var_dump("\xCE\xB1" == html_entity_decode('&#x03B1;', ENT_COMPAT, 'UTF-8'));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top