如何在PHP中将HTML字符数字转换为普通字符?

3
我有一些HTML数据(我无法控制,只能读取),其中包含许多斯堪的纳维亚字符(如å、ä、ö、æ、ø等)。这些“特殊”字符被存储为HTML字符数字(æ = æ)。我需要在PHP中将它们转换为相应的实际字符(或JavaScript,但我想在这里使用PHP更好...)。似乎html_entity_decode()只处理“其他”类型的实体,其中æ = &#aelig;。到目前为止,我想到的唯一解决方案是制作一个转换表,并将每个字符数字映射到实际字符,但这并不是非常聪明的做法...所以,有什么想法吗? ;)
祝好, Christofer

html_entity_decode() 对你来说有什么问题?你传递的字符集参数是什么?在我的测试中似乎可以正常工作... - Matt Gibson
是的,结果证明它完美地运行了...如果你正确地阅读了手册 ;) 谢谢! - cpak
4个回答

5
&#NUMBER;

指的是该字符的Unicode值。

因此,您可以使用一些正则表达式,例如:

/&#(\d+);/g

想获取数字,我不会PHP,但我相信你可以通过谷歌搜索将数字转化为其Unicode等效字符的方法。

然后只需用该字符替换您的正则表达式匹配即可。

编辑:实际上,您可以使用以下内容:

mb_convert_encoding('æ', 'UTF-8', 'HTML-ENTITIES');

2
我认为html_entity_decode()应该可以正常工作。你尝试时会发生什么:
echo html_entity_decode('æ', ENT_COMPAT, 'UTF-8');

0
在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);

正如评论中有人指出的那样,你应该用unichr()替换chr()来处理非ASCII字符。
然而,看起来html_entity_decode()确实应该处理数字实体和文字实体。你是否指定了适当的字符集(例如UTF-8)?

0
如果您没有安装多字节字符串函数的奢侈,可以使用类似以下的东西:
<?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));
        }
    }


?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接