บรรทัดใหม่ปรากฏขึ้นหลังแท็ก ‹br› ใน DOMDocument saveHTML()

ฉันใช้ PHP DOM API เพื่อสร้างมาร์กอัป ใช้งานได้ดี แต่ในบางกรณี บรรทัดใหม่ \n จะปรากฏหลังแท็ก <br> ฉันจัดการเพื่อสร้าง reprex:

$document = new DOMDocument();
$document->loadHTML('<div>text<br></div>');
$element = $document->getElementsByTagName('div')->item(0);

echo $document->saveHTML($element); // newline appears after <br>

ด้วยเหตุผลบางประการ saveHTML() จึงไม่ส่งคืนมาร์กอัปเดียวกับที่โหลดครั้งแรก ดังที่ฉันได้สาธิตไปแล้วใน repl การเพิ่มข้อความรอบแท็ก <br> หรือใช้ saveXML() ทำงานได้อย่างถูกต้อง

นี่เป็นลักษณะการทำงานพิเศษที่กำหนดไว้ในข้อกำหนด DOM หรือไม่ ปัญหาดูเหมือนจะเกิดขึ้นเมื่อแท็ก <br> เป็นแท็กลูกแรกหรือลูกสุดท้ายเท่านั้น นั่นคือ I.E. ไม่มีข้อความอยู่ระหว่างนั้น


person dodov    schedule 24.07.2019    source แหล่งที่มา
comment
loadHTML และ saveHTML ไม่ปฏิบัติตามข้อกำหนด DOM เนื่องจากจะอนุญาตให้มี XML ที่เสียหาย ซึ่งคนส่วนใหญ่เรียกว่า HTML ตัวอย่างของคุณมีแท็ก <br> ที่ไม่ปิดแต่ยังคงอ่านได้ มีหลายสิ่งหลายอย่างที่มันจะกรุณาทำเพื่อคุณซึ่งอาจไม่ใช่สิ่งที่คุณต้องการจริงๆ แต่มันใช้ได้กับ HTML ที่มีรูปแบบไม่ดีบางอัน   -  person Nigel Ren    schedule 24.07.2019
comment
ดูที่การจัดรูปแบบเอาต์พุต   -  person Markus Zeller    schedule 24.07.2019
comment
@NigelRen ตามข้อกำหนด HTML, <br> คือ องค์ประกอบที่เป็นโมฆะและการใส่ / นำหน้า > ไม่มีผลใด ๆ และดังนั้นจึงเป็นทางเลือกหรือไม่ ไม่มีใครบอกว่า PHP เป็นไปตามข้อกำหนดนั้น @MarkusZeller ฉันพยายามตั้งค่า formatOutput เป็น false สิ่งเดียวกันเกิดขึ้น ฉันคิดว่า false เป็นค่าเริ่มต้น   -  person dodov    schedule 24.07.2019
comment
@NigelRen แม้ว่าฉันจะมี <br/> แทนที่จะเป็น <br> แต่ saveHTML() ยังคงเพิ่ม \n และส่งออกแท็กเป็น <br> ต่อไป   -  person dodov    schedule 24.07.2019
comment
ปัญหาคือ DOMDocument เป็นไลบรารี XML ไม่ใช่ไลบรารี HTML มีกฎของตัวเองเกี่ยวกับวิธีการคิดว่า HTML ควรได้รับการแก้ไขและส่งออก การขึ้นบรรทัดใหม่ไม่มีผลกับ HTML ดังนั้นจึงอาจไม่เห็นว่าเป็นปัญหา   -  person Nigel Ren    schedule 24.07.2019


คำตอบ (1)


ดูเหมือนว่าจะเป็นข้อบกพร่องใน libxml ปัญหาเกิดขึ้นในเวอร์ชัน 2.9.7 แต่หลังจากอัปเดตเป็น XAMPP 3.2.4 ด้วย PHP 7.3.8 และ libxml 2.9.9 แล้ว ปัญหาก็หยุดอยู่

person dodov    schedule 12.08.2019