В PHP можно передавать необязательные аргументы различным синтаксическим анализаторам XML, одним из которых является LIBXML_NOENT
, документация есть что сказать об этом:
LIBXML_NOENT (целое число)
Заменяющие лица
Substitute entities
не очень информативен (какие объекты? когда они заменены?). Но я думаю, что было бы справедливо предположить, что NOENT
коротка для NO_ENTITIES
или же NO_EXTERNAL_ENTITIES
так что мне кажется справедливым предположение, что этот флаг отключает разбор (внешних) сущностей.
Но это действительно не случай:
$xml = '<!DOCTYPE root [<!ENTITY c PUBLIC "bar" "/etc/passwd">]>
<test>&c;</test>';
$dom = new DOMDocument();
$dom->loadXML($xml, LIBXML_NOENT);
echo $dom->textContent;
В результате выводится содержимое файла / etc / passwd. Без LIBXML_NOENT
аргумент это не тот случай.
Для внешних объектов флаг, кажется, не имеет никакого эффекта. Пример:
$xml = '<!DOCTYPE root [<!ENTITY c "TEST">]>
<test>&c;</test>';
$dom = new DOMDocument();
$dom->loadXML($xml);
echo $dom->textContent;
Результатом этого кода является «ТЕСТ», с и без LIBXML_NOENT
,
Флаг не оказывает никакого влияния на заранее определенные объекты, такие как <
,
Итак, мои вопросы:
LIBXML_NOENT
флаг делать?LIBXML_NOENT
? Что это коротко, и не будет LIBXML_ENT
или же LIBXML_PARSE_EXTERNAL_ENTITIES
быть лучше подходит?Вопрос: Что именно делает флаг LIBXML_NOENT?
Флаг позволяет заменять ссылки на сущности символов XML внешними или нет.
Q: Почему это называется LIBXML_NOENT? Для чего он нужен, и LIBXML_ENT или LIBXML_PARSE_EXTERNAL_ENTITIES лучше не подойдут?
Имя действительно вводит в заблуждение. я думаю что NOENT
просто означает, что дерево узлов разобранного документа не будет содержать никаких узлов сущности, поэтому анализатор заменит сущности. Без NOENT
парсер создает DOMEntityReference узлы для ссылок на сущности.
Q: есть флаг, который фактически предотвращает разбор всех сущностей?
LIBXML_NOENT
позволяет заменить все ссылки на сущности. Если вы не хотите расширять сущности, просто опустите флаг. Например
$xml = '<!DOCTYPE test [<!ENTITY c "TEST">]>
<test>&c;</test>';
$dom = new DOMDocument();
$dom->loadXML($xml);
echo $dom->saveXML();
печать
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY c "TEST">
]>
<test>&c;</test>
Кажется, что textContent
заменяет сущности самостоятельно, что может быть особенностью PHP-привязок. Без LIBXML_NOENT
, это приводит к разному поведению для внутренних и внешних объектов, потому что последний не будет загружен.
Других решений пока нет …