Превращение объектов персонажа HTML в «обычные» буквы ... почему он работает только частично?
-
23-09-2019 - |
Вопрос
Я использую все приведенное ниже, чтобы взять поле, называемое «код» из моей базы данных, избавьтесь от всех объектов 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 или кавычки, а не кудривые кавычки. Числовые объекты, которые вы преобразуете, должны быть '
или же '
(апостроф) или "
или же "
(кавычка). Вместо этого у вас, кажется, есть ’
, который представляет тот же характер, что и ’
, ’
, или же ’
.
Что касается второй проблемы, полученный текст, по-видимому, кодируется как 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('α', ENT_COMPAT, 'UTF-8'));