Во-первых, обратите внимание, что $
не является известным объектом в HTML 4.01 .Однако это в HTML 5, а в PHP 5.4 вы можете вызвать html_entity_decode
с помощью ENT_QUOTES | ENT_HTML5
для его декодирования.
Вы должны декодировать объект и только затем преобразовать его:
//assumes $str is in UTF-8 (or ASCII)
function foo($str) {
$dec = html_entity_decode($str, ENT_QUOTES, "UTF-8");
//convert to UTF-16BE
$enc = mb_convert_encoding($dec, "UTF-16BE", "UTF-8");
$out = "";
foreach (str_split($enc, 2) as $f) {
$out .= "\\u" . sprintf("%04X", ord($f[0]) << 8 | ord($f[1]));
}
return $out;
}
Если вы хотите заменить только сущности, вы можете использовать preg_replace_callback
для сопоставления сущностей, а затем использовать foo
в качестве обратного вызова.
function repl_only_ent($str) {
return preg_replace_callback('/&[^;]+;/',
function($m) { return foo($m[0]); },
$str);
}
echo repl_only_ent("€foobar ´");
дает:
\u20ACfoobar \u00B4