Как преобразовать HTML-символьные цифры в обычные символы в PHP? - PullRequest
3 голосов
/ 08 сентября 2010

У меня есть некоторые данные HTML (которые я не могу контролировать, могу только читать), которые содержат много скандинавских символов (å, ä, ö, æ, ø и т. Д.). Эти «специальные» символы хранятся в виде символов HTML цифр (æ = æ). Мне нужно преобразовать их в соответствующий фактический символ в PHP (или JavaScript, но я думаю, PHP лучше здесь ...). Похоже, html_entity_decode() обрабатывает только «другие» виды сущностей, где æ = &#aelig;. Единственное решение, которое я придумала до сих пор, - это создать таблицу преобразования и сопоставить каждый номер персонажа с реальным, но это не очень умно ... Итак, есть идеи? ;)

Ура, Christofer

Ответы [ 4 ]

5 голосов
/ 08 сентября 2010
&#NUMBER;

относится к значению Unicode этого символа.

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

/&#(\d+);/g

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

Затем просто замените ваш матч с регулярным выражением на символ.

Редактировать : На самом деле похоже, что вы можете использовать это:

mb_convert_encoding('æ', 'UTF-8', 'HTML-ENTITIES');
2 голосов
/ 08 сентября 2010

Я думаю html_entity_decode() должно работать просто отлично. Что происходит при попытке:

echo html_entity_decode('æ', ENT_COMPAT, 'UTF-8');
0 голосов
/ 08 сентября 2010

Если у вас нет возможности установить многобайтовые строковые функции, вы можете использовать что-то вроде этого:

<?php

    $string = 'Here is a special char &#230;';

    $list = preg_replace_callback('/(&#([0-9]+);)/', create_function(
        '$matches', 'return decode(array($matches[2]));'
    ), $string);

    echo '<p>', $string, '</p>';
    echo '<p>', $list, '</p>';

    function decode(array $list)
    {
        foreach ($list as $key=>$value) {
            return utf8_encode(chr($value));
        }
    }


?>
0 голосов
/ 08 сентября 2010

На странице справки по PHP на html_entity_decode() он дает следующий код для декодирования числовых сущностей в версиях PHP до 4.3.0:

  $string = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $string);
  $string = preg_replace('~&#([0-9]+);~e', 'chr("\\1")', $string);

Как заметил кто-то в комментариях, вы должнывероятно, замените chr() на unichr(), чтобы иметь дело с не-ASCII символами.

Однако, похоже, что html_entity_decode() действительно должно иметь дело как с числовыми, так и с буквальными сущностями.Указываете ли вы соответствующую кодировку (например, UTF-8)?

...