libxml的htmlParseDocument忽略htmlParseOption标志(libxml

2019-09-25 18:00发布

找人谁通过比PHP包装,确认HTML_PARSE_NOWARNING标志被忽略对方的环境中使用的libxml。 警告仍然产生。

从PHP源代码,用C实现的libxml:

//one of these options is 64 or HTML_PARSE_NOWARNING
htmlCtxtUseOptions(ctxt, (int)options);

ctxt->vctxt.error = php_libxml_ctx_error;
ctxt->vctxt.warning = php_libxml_ctx_warning;
if (ctxt->sax != NULL) {
    ctxt->sax->error = php_libxml_ctx_error;
    ctxt->sax->warning = php_libxml_ctx_warning;
}
htmlParseDocument(ctxt); //this still produces warnings

Answer 1:

libxml2的不忽略HTML_PARSE_NOWARNING标志。 调用htmlCtxtUseOptionsHTML_PARSE_NOWARNING导致警告处理被注销(设置为NULL)。 但是PHP代码然后继续无条件地安装自己的处理程序,使该标志没用。 PHP代码要么添加一个检查是否安装了处理程序:

htmlCtxtUseOptions(ctxt, (int)options);

if (!(options & HTML_PARSE_NOERROR)) {
    ctxt->vctxt.error = php_libxml_ctx_error;
    if (ctxt->sax != NULL)
        ctxt->sax->error = php_libxml_ctx_error;
}
if (!(options & HTML_PARSE_NOWARNING)) {
    ctxt->vctxt.warning = php_libxml_ctx_warning;
    if (ctxt->sax != NULL)
        ctxt->sax->warning = php_libxml_ctx_warning;
}
htmlParseDocument(ctxt);

或致电htmlCtxtUseOptions设置处理程序后:

ctxt->vctxt.error = php_libxml_ctx_error;
ctxt->vctxt.warning = php_libxml_ctx_warning;
if (ctxt->sax != NULL) {
    ctxt->sax->error = php_libxml_ctx_error;
    ctxt->sax->warning = php_libxml_ctx_warning;
}

htmlCtxtUseOptions(ctxt, (int)options);
htmlParseDocument(ctxt);


文章来源: libxml htmlParseDocument ignoring htmlParseOption flags
标签: php libxml2