代码之家  ›  专栏  ›  技术社区  ›  peterjwest

为什么phpdom不在自动关闭标记上包含斜杠?

  •  9
  • peterjwest  · 技术社区  · 15 年前

    我一直在使用PHP的DOM加载html模板,修改并输出它。最近我发现self-closing(空)标记不包含结束斜杠,即使模板文件包含结束斜杠。

    例如

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"`"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    </head>
    <body>
    </body>
    </html>
    

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    </head>
    <body>
    </body>
    </html>
    

    这是一个bug还是一个设置,还是一个doctype问题?

    3 回复  |  直到 15 年前
        1
  •  22
  •   bobince    15 年前

    DOMDocument->saveHTML() 获取您的xmldominfoset并将其作为旧式HTML(而不是XML)写出。你不应该使用 saveHTML() 与XHTML doctype一起使用,因为它的输出不是格式良好的XML。

    如果你使用 saveXML() Content-Type: application/xhtml+xml 标题。但不幸的是IE6-8无法读取这些内容,因为它们仍然只能处理旧式HTML,在 text/html 媒体类型。

    文本/html 并使用“HTML兼容的XHTML”,如XHTML1.0规范的附录C所述,但遗憾的是没有PHP DOMDocument->saveXHTML()

    为一些常见情况生成与HTML兼容的输出。主要的一点是,您必须确保只有HTML4定义的元素具有 EMPTY <img> , <br> etc)确实有空内容,导致自动关闭语法( <img/> )待使用。其他元素不能使用自动关闭语法,因此如果它们为空,则应在其文本内容中放置空格,以防止它们为空:

    <script src="x.js"/>           <-- no good, confuses HTML parser and breaks page
    <script src="x.js"> </script>  <-- fine
    

    <script> <style> 元素,这是XHTML中的常规元素,但特殊 CDATA /*<![CDATA[*/.../*]]>*/ < & ]]> </ 序列。

        2
  •  2
  •   nathan    15 年前

    doctype问题因为它是text/html,所以不需要右斜杠,只有当它是xhtml文档时才需要右斜杠

    注意到您已经更新了doctype,但是phpdom也会查看您在其中的meta标记,content=“text/html;charset=utf-8“显然不是基于XML的,它只是text/html:)

    旁白:domapi也从中获取字符集

        3
  •  -1
  •   Brad Kent    10 年前

    这是个老问题,但是。。。

    如果你愿意的话,这里有一个正则表达式来关闭“void”标签

    $voidTags = array('area','base','br','col','command','embed','hr','img','input','keygen','link','meta','param','source','track','wbr');
    $regEx = '#<('.implode('|', $voidTags).')(\b[^>]*)>#';
    $html = preg_replace($regEx, '<\\1\\2 />', $html);
    
    推荐文章