Doc #66712 [Com]: Using LIBXML_HTML_NOIMPLIED on DomDocument::loadHTML() gives unexpected results

From: Date: Thu, 07 Sep 2023 18:45:32 +0000
Subject: Doc #66712 [Com]: Using LIBXML_HTML_NOIMPLIED on DomDocument::loadHTML() gives unexpected results
References: 1  Groups: php.doc.bugs 
Request: Send a blank email to doc-bugs+get-19663@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=66712&edit=1

 ID:                 66712
 Comment by:         nielsdos@php.net
 Reported by:        chanson at mesd dot k12 dot or dot us
 Summary:            Using LIBXML_HTML_NOIMPLIED on
                     DomDocument::loadHTML() gives unexpected results
 Status:             Verified
 Type:               Documentation Problem
 Package:            DOM XML related
 Operating System:   Fedora 20 x86/64
 PHP Version:        5.5.9
 Block user comment: N
 Private report:     N

 New Comment:

I contacted the libxml2 developer, and he confirmed it *is* actually a bug and has fixed the bug: https://gitlab.gnome.org/GNOME/libxml2/-/issues/584
The next release of libxml2 will have the right behaviour, i.e. no nesting inside h1.


Previous Comments:
------------------------------------------------------------------------
[2023-06-08 20:45:01] nielsdos@php.net

Agreed that this is a documentation issue. The document element indeed becomes the <h1> tag
and everything becomes nested under it: <h1>Foo<h2>Bar</h2><p>lorem
ipsum</p></h1>
I think this is correct behaviour.

------------------------------------------------------------------------
[2015-11-09 14:47:01] dlundgren at syberisle dot net

This may be more of a documentation issue than a code issue. After encountering the same problem
recently, I found that the first element becomes the root element of the document. To offset this I
wrapped the html fragment in a root element, and I was able to work with it that way.

This is most likely due to our lack of understanding that the DOM Level 2 requires a document to
have a single documentElement, with children under it. I had to look that up to understand what I
was doing wrong.

------------------------------------------------------------------------
[2015-04-15 14:46:01] cmb@php.net

Well, of course the behavior is reproducible -- only the expected
and actual behavior sections in the report are mixed up.

------------------------------------------------------------------------
[2015-04-15 14:41:47] cmb@php.net

I am not able to reproduce this behavior, see
<http://3v4l.org/SFlNo>. Can you confirm?

------------------------------------------------------------------------
[2014-02-14 01:23:21] chanson at mesd dot k12 dot or dot us

Description:
------------
Using the LIBXML_HTML_NOIMPLIED predefined constant in the DomDocument class has unexpected results.

The nodeValue of any first DOMNodeList item always contains all the values of every node list item
in the collection only when the optional LIBXML_HTML_NOIMPLIED predefined constant is passed to the
loadHTML() method.

I am currently running:
- PHP Version 5.5.8
- libxml Version 2.9.1

Test script:
---------------
$html = '<h1>Foo</h1><h2>Bar</h2><p>lorem ipsum</p>';
$dom = new \DomDocument();
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED);
$nodes = $dom->getElementsByTagName('*');
echo $nodes->item(0)->tagName . ' -> ' . $nodes->item(0)->nodeValue .
'<br/>';
foreach ($nodes as $node) {
    echo $node->tagName . ' -> ' . $node->nodeValue . '<br/>';
}

Expected result:
----------------
h1 -> FooBarlorem ipsum
h1 -> FooBarlorem ipsum
h2 -> Bar
p -> lorem ipsum

Actual result:
--------------
h1 -> Foo
h1 -> Foo
h2 -> Bar
p -> lorem ipsum


------------------------------------------------------------------------



--
Edit this bug report at https://bugs.php.net/bug.php?id=66712&edit=1


Thread (2 messages)

« previous php.doc.bugs (#19663) next »