PHP8.4に上げたら、DOMDocumentでルートレベルのDOMは一個しかないはずとか言う実装になったっぽくて、LIBXML_HTML_NOIMPLIEDオプションを指定して読み込ませたHTMLが、最初に見つけたルートレベル要素しか処理されなくなった。

仕方なく<hoge>で括って、<hoge><p>1</p><p>2</p></hoge>で読ませてsaveHTML($htmlDocument->querySelector('hoge > *'))したら、<p>1</p><p>2</p>が取り出せるのかと思ったら、それもルートレベルが複数になるので<p>1</p>しか返ってこなくて、結局全部取り出してstr_replaceで外側のタグを消すとか言う原始的な処理になった。

そして、今困っているのは<br>タグが<br></br>に書き換えられてしまうんだけど、再帰処理で何度か回していると、これが増殖して無限<br></br>編が始まってしまい、めっちゃ行間があく。なんでそこだけXMLみたいな処理するんだよ。というかPHP8.3の動作に戻してくれ~。いや、もしかしたらLIBXMLの動作なのかもしれんけど。

LLMに聞いてもDOMDocumentでしか使えないオプションを回答してきて、そのオプションはDom\HTMLDocument(PHP8.4からこっちが推奨になった)で使えねーと困ったが、他の解法として、これも<br></br>を<br>に置換するという原始的処理で対応できた。内部で無駄な書き換えが発生していて処理が無駄だなぁ。

フォロー

PHP8.3以前でDOMDocumentを使ってるときは大丈夫だったんだよな。そっちが壊れてたのかもしれんが。

ログインして会話に参加
:realtek:

思考の /dev/null