У PHP нет функции для XML-безопасного декодирования объектов? У вас нет xml_entity_decode?
ПРОБЛЕМА: Мне нужен XML-файл, "полностью закодированный" UTF8; то есть без сущности, представляющей символы, все символы, заключенные в UTF8, за исключением только 3-х, которые зарезервированы для XML, "&" (amp), "<" (lt) и ">" (gt). А также,мне нуженвстроенные функция, которая делает это быстро: преобразовать сущности в реальные символы UTF8 (без искажения моего XML).
PS: это «проблема реального мира» (!); вPMC / журналынапример, 2,8 млн научных статей,специальный XML DTD (известен также какФормат JATS) ... Чтобы обработать как "обычный XML-UTF8-текст", нам нужно перейти от числовой сущности к символу UTF8.
ПОПЫТКА РЕШЕНИЯ: естественная функция для этой задачиhtml_entity_decode, но он уничтожает код XML (!), преобразуя зарезервированные 3 зарезервированных символа XML.
Иллюстрируя проблемупредполагать
$xmlFrag ='<p>Hello world!    Let A<B and A=∬dxdy</p>';
Где объекты 160 (nbsp) и x222C (двойной интеграл) должны быть преобразованы в UTF8, а XML-зарезервированыlt
не. Текст XML будет (после преобразования),
$ xmlFrag = '<p>
Привет, мир! Пусть А<
B и A = xdxdy</p>
«;
Текст "A <B" требует зарезервированного символа XML, поэтому ДОЛЖЕН оставатьсяA<B
.
Я пытаюсь использоватьhtml_entity_decode
для решения (напрямую!) проблемы ... Итак, я обновил свой PHP до v5.5, чтобы попытаться использоватьENT_XML1
вариант,
$s = html_entity_decode($xmlFrag, ENT_XML1, 'UTF-8'); // not working
// as I expected
Возможно, другой вопрос,"Почему нет другого варианта сделать то, что я ожидал?" - это важно для многих других приложений XML (!), не только для меня.
Мне не нужнаобходной путь как ответ ... Хорошо, я показываю свою уродливую функцию, возможно, это поможет вам понять проблему,
function xml_entity_decode($s) {
// here an illustration (by user-defined function)
// about how the hypothetical PHP-build-in-function MUST work
static $XENTITIES = array('&','>','<');
static $XSAFENTITIES = array('#_x_amp#;','#_x_gt#;','#_x_lt#;');
$s = str_replace($XENTITIES,$XSAFENTITIES,$s);
//$s = html_entity_decode($s, ENT_NOQUOTES, 'UTF-8'); // any php version
$s = html_entity_decode($s, ENT_HTML5|ENT_NOQUOTES, 'UTF-8'); // PHP 5.3+
$s = str_replace($XSAFENTITIES,$XENTITIES,$s);
return $s;
} // you see? not need a benchmark:
// it is not so fast as direct use of html_entity_decode; if there
// was an XML-safe option was ideal.
PS: исправлено послеэтот ответ, Должно бытьENT_HTML5
флаг, для преобразованияна самом деле все именованные объекты.