Перекодировать htmlentities в человеческий текст

Рейтинг: 0Ответов: 2Опубликовано: 13.03.2015

Доброго времени суток. Средствами PHP получаю страницу с сайта, которую хочу парсить. В некоторых, критически важных полях нахожу вместо текста полный

приобр&

Декодер Лебедева успешно кодирует этот бред

HTML-Entities → UTF-8

html_entity_decode, которую советуют на многих форумах делает из этого потока

оставка

То есть нельзя сказать, что не работает... но не так, как хотелось бы. Подскажите, что делать?

Ответы

▲ 2

Сначала, очевидно, нужно заменить все "&" на "&". Можно обычным str_replace. После этого html_entity_decode работает нормально:

<?php
echo html_entity_decode(
   "&#1087;&#1088;&#1080;&#1086;&#1073;&#1088;", 
   ENT_COMPAT, 
   "UTF-8"
);
?>

Вывод:

приобр
▲ 0

Костыль костыльный, но работает.

function Unicode2Charset($string, $charset = 'UTF-8') {
    $string = html_entity_decode($string, ENT_NOQUOTES, $charset);
    return preg_replace(
        '~&#(?:x([\da-f]+)|(\d+));~ie',
        'iconv("UTF-16LE", $charset, pack("v", "$1" ? hexdec("$1") : "$2"))',
        $string
    );
}
$string = '&amp;#1087;&amp;#1088;&amp;#1080;&amp;#1086;&amp;#1073;&amp;#1088;&amp;';

echo Unicode2Charset($string); // OutPut приобр&