Что делает LIBXML_NOENT (и почему он не называется LIBXML_ENT)?

В 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,

Флаг не оказывает никакого влияния на заранее определенные объекты, такие как &lt;,

Итак, мои вопросы:

  • Что именно делает LIBXML_NOENT флаг делать?
  • Почему это называется LIBXML_NOENT? Что это коротко, и не будет LIBXML_ENT или же LIBXML_PARSE_EXTERNAL_ENTITIES быть лучше подходит?
  • Есть ли флаг, который фактически предотвращает разбор всех сущностей?

4

Решение

Вопрос: Что именно делает флаг 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, это приводит к разному поведению для внутренних и внешних объектов, потому что последний не будет загружен.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]