PHP8.4に上げたら、DOMDocumentでルートレベルのDOMは一個しかないはずとか言う実装になったっぽくて、LIBXML_HTML_NOIMPLIEDオプションを指定して読み込ませたHTMLが、最初に見つけたルートレベル要素しか処理されなくなった。
Conversation
Notices
-
Embed this notice
おさ (osapon@mstdn.nere9.help)'s status on Sunday, 17-Aug-2025 20:48:02 JST
おさ
-
Embed this notice
おさ (osapon@mstdn.nere9.help)'s status on Sunday, 17-Aug-2025 20:50:45 JST
おさ
仕方なく<hoge>で括って、<hoge><p>1</p><p>2</p></hoge>で読ませてsaveHTML($htmlDocument->querySelector('hoge'))したら、<p>1</p><p>2</p>が取り出せるのかと思ったら、それもルートレベルが複数になるので<p>1</p>しか返ってこなくて、結局全部取り出してstr_replaceで外側のタグを消すとか言う原始的な処理になった。
-
Embed this notice
おさ (osapon@mstdn.nere9.help)'s status on Sunday, 17-Aug-2025 20:53:58 JST
おさ
そして、今困っているのは<br>タグが<br></br>に書き換えられてしまうんだけど、再帰処理で何度か回していると、これが増殖して無限<br></br>編が始まってしまい、めっちゃ行間があく。なんでそこだけXMLみたいな処理するんだよ。というかPHP8.3の動作に戻してくれ~。いや、もしかしたらLIBXMLの動作なのかもしれんけど。
-
Embed this notice
おさ (osapon@mstdn.nere9.help)'s status on Sunday, 17-Aug-2025 21:02:10 JST
おさ
LLMに聞いてもDOMDocumentでしか使えないオプションを回答してきて、そのオプションはDom\HTMLDocument(PHP8.4からこっちが推奨になった)で使えねーと困ったが、他の解法として、これも<br></br>を<br>に置換するという原始的処理で対応できた。内部で無駄な書き換えが発生していて処理が無駄だなぁ。 #PHP
-
Embed this notice
おさ (osapon@mstdn.nere9.help)'s status on Sunday, 17-Aug-2025 21:08:44 JST
おさ
PHP8.3以前でDOMDocumentを使ってるときは大丈夫だったんだよな。そっちが壊れてたのかもしれんが。
-
Embed this notice