我有一些HTML数据(我无法控制,只能读取它),其中包含许多斯堪的纳维亚字符(å,ä,ö,æ,ø等)。这些“特殊”字符存储为HTML字符数字(æ= æ
)。我需要将这些转换为PHP中的相应实际字符(或JavaScript,但我想PHP在这里更好......)。似乎html_entity_decode()
只处理“其他”类型的实体,其中æ= &#aelig;
。到目前为止,我提出的唯一解决方案是制作一个转换表并将每个字符数映射到一个真实的角色,但这并不是真正超级聪明......
那么,有什么想法吗? ;)
干杯, 克里斯托弗
答案 0 :(得分:5)
&#NUMBER;
指的是该char的unicode值。
所以你可以使用一些正则表达式:
/&#(\d+);/g
获取数字,我不知道PHP,但我确定你可以谷歌如何将数字转换为其unicode等效字符。
然后只需用char替换你的正则表达式匹配。
修改:实际上看起来你可以使用它:
mb_convert_encoding('æ', 'UTF-8', 'HTML-ENTITIES');
答案 1 :(得分:2)
我认为html_entity_decode()
应该可以正常工作。当你尝试时会发生什么:
echo html_entity_decode('æ', ENT_COMPAT, 'UTF-8');
答案 2 :(得分:0)
在html_entity_decode()
上的PHP手册页上,它提供了以下代码,用于解码4.3.0之前的PHP版本中的数字实体:
$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)?
答案 3 :(得分:0)
如果您没有安装多字节字符串功能,可以使用以下内容:
<?php
$string = 'Here is a special char æ';
$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));
}
}
?>