PHP如何将文本编码为数字实体?

时间:2013-12-17 14:09:52

标签: php xml dom encoding domdocument

我有这样的xml:

<formula type="inline">
    <default:math xmlns="http://www.w3.org/1998/Math/MathML">
        <default:mi>
            &Zopf;
        </default:mi>
    </default:math>
</formula>

我的目标是通过用数字实体演示替换它们来摆脱所有特殊实体,例如&Zopf;

我试过了:

$test    = <content of the xml>;
$convmap = array(0x80, 0xffff, 0, 0xffff);
$test    = mb_encode_numericentity($test, $convmap, 'UTF-8');

但这不会取代&Zopf;任何想法吗?

我的目标是获得:

&#8484; 

如下所示:http://www.fileformat.info/info/unicode/char/2124/index.htm

谢谢。

2 个答案:

答案 0 :(得分:1)

您的转换器正在将您的LaTeX转换为MathML,而不是HTML实体。您需要能够直接转换为HTML字符引用的内容,或MathML to HTML character reference converter

您应该可以使用htmlentities

htmlentities($symbolsToEncode, ENT_XML1, 'UTF-8');

http://pt1.php.net/htmlentities

您可以将ENT_XML1更改为ENT_SUBSTITUTE,它将返回Unicode替换字符或十六进制字符引用。

作为替代方案,您可以使用strtr将字符转换为您指定的字符:

$chars = array(
    "\x8484" => "&#x8484;"
    ...
);

$convertedXML = strtr($xml, $chars);

http://php.net/strtr

Someone has done something similar on GitHub

答案 1 :(得分:0)

所以你需要首先解码命名实体:

function decodeNamedEntities($string) {
  static $entities = NULL;
  if (NULL === $entities) {
    $entities = array_flip(
      array_diff(
        get_html_translation_table(HTML_ENTITIES, ENT_COMPAT | ENT_HTML5, 'UTF-8'),
        get_html_translation_table(HTML_ENTITIES, ENT_COMPAT | ENT_XML1, 'UTF-8')
      )
    );
  }
  return str_replace(array_keys($entities), $entities, $string);
}

之后,如果确实需要,您可以使用htmlentities以不同的格式对其进行编码。