关于:HTML <!DOCTYPE> 标签

本文详细解释了HTML和XHTML文档中的DOCTYPE声明的作用及不同类型的DTD,包括Strict、Transitional和Frameset,以及它们如何影响文档的表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近修改同事做的页面时出现错误,我自己做的时候正常,但是将修改的部分代码复制到他的页面中时出现错误,主要样式改变较大。对比发现是HTML <!DOCTYPE> 标签 不同。就查了一下W3C的关于<!DOCTYPE> 标签的详细说明。一下是W3C的详细说明。以此让自己注意也让大家关注一下。

<!DOCTYPE> 声明位于文档中的最前面的位置,处于 <html> 标签之前。此标签可告知浏览器文档使用哪种 HTML 或 XHTML 规范。
该标签可声明三种 DTD 类型,分别表示严格版本、过渡版本以及基于框架的 HTML 文档。
以下面这个 <!DOCTYPE> 标签为例:
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

在上面的声明中,声明了文档的根元素是 html,它在公共标识符被定义为 "-//W3C//DTD XHTML 1.0 Strict//EN" 的 DTD 中进行了定义。浏览器将明白如何寻找匹配此公共标识符的 DTD。如果找不到,浏览器将使用公共标识符后面的 URL 作为寻找 DTD 的位置。
提示和注释:
注释:<!DOCTYPE> 标签没有结束标签!
HTML
HTML 4.01 规定了三种文档类型:Strict、Transitional 以及 Frameset。
HTML Strict DTD
如果您需要干净的标记,免于表现层的混乱,请使用此类型。请与层叠样式表(CSS)配合使用:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "
http://www.w3.org/TR/html4/strict.dtd">

HTML Transitional DTD
Transitional DTD 可包含 W3C 所期望移入样式表的呈现属性和元素。如果您的读者使用了不支持层叠样式表(CSS)的浏览器以至于您不得不使用 HTML 的呈现特性时,请使用此类型:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "
http://www.w3.org/TR/html4/loose.dtd">
Frameset DTD
Frameset DTD 应当被用于带有框架的文档。除 frameset 元素取代了 body 元素之外,Frameset DTD 等同于 Transitional DTD:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "
http://www.w3.org/TR/html4/frameset.dtd">

XHTML
XHTML 1.0 规定了三种 XML 文档类型:Strict、Transitional 以及 Frameset。
XHTML Strict DTD
如果您需要干净的标记,免于表现层的混乱,请使用此类型。请与层叠样式表(CSS)配合使用:
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

XHTML Transitional DTD
Transitional DTD 可包含 W3C 所期望移入样式表的呈现属性和元素。如果您的读者使用了不支持层叠样式表(CSS)的浏览器以至于您不得不使用 XHTML 的呈现特性时,请使用此类型:
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

XHTML Frameset DTD
当您希望使用框架时,请使用此 DTD!
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

如需检查你是否编写了带有正确 DTD 的合法 XHTML 文档,您可以把您的 XHTML 页面链接到一个 XHTML 验证器。
QString result; result.reserve(html.size() + 500); // 增加预分配内存 // 1. 添加XML声明 result.append("&lt;?xml version=\"1.0\" encoding=\"ISO-8859-1\"?&gt;\n"); // 2. 移除DOCTYPE声明 QString normalized = html; QRegularExpression doctypeRegex("&lt;!DOCTYPE[^&gt;]*&gt;"); normalized.replace(doctypeRegex, ""); // 2. 统一处理字符集声明(更健壮的正则表达式) QRegularExpression charsetRegex(R"(charset\s*=\s*["']?([\w\-]+)["']?)", QRegularExpression::CaseInsensitiveOption); normalized.replace(charsetRegex, "charset=\"ISO-8859-1\""); // 3. 全局转义特殊字符(更全面的处理) normalized.replace("&amp;", "&amp;"); // 先转义所有&amp;符号 normalized.replace("&amp;amp;", "&amp;"); // 修复双重转义 normalized.replace("&amp;quot;", """); normalized.replace("&amp;lt;", "&lt;"); normalized.replace("&amp;gt;", "&gt;"); normalized.replace("&amp;apos;", "&amp;apos;"); // 4. 处理所有自闭合标签展列表) QRegularExpression selfClosingTags(R"(&lt;(meta|link|img|br|hr|input|area|base|col|command|embed|keygen|param|source|track|wbr)([^&gt;]*?)\s*/?&gt;)", QRegularExpression::CaseInsensitiveOption); normalized.replace(selfClosingTags, "&lt;\\1\\2/&gt;"); // 5. 标签规范化(更全面的处理) QRegularExpression tagRegex(R"(&lt;(\/?)(\w+)([^&gt;]*)&gt;)", QRegularExpression::CaseInsensitiveOption); int pos = 0; QRegularExpressionMatchIterator it = tagRegex.globalMatch(normalized); while (it.hasNext()) { QRegularExpressionMatch match = it.next(); if (match.capturedStart() &gt; pos) { result.append(normalized.mid(pos, match.capturedStart() - pos)); } QString slash = match.captured(1); QString tag = match.captured(2).toLower(); // 统一转为小写 QString attrs = match.captured(3); // 处理无效闭合标签 if (tag == "link" &amp;&amp; slash == "/") { pos = match.capturedEnd(); continue; } // 属性引号规范化(更健壮的处理) QRegularExpression attrRegex(R"((\w+)\s*=\s*([^"'\s&gt;]+))"); QRegularExpressionMatchIterator attrIt = attrRegex.globalMatch(attrs); QString fixedAttrs = attrs; int attrOffset = 0; while (attrIt.hasNext()) { QRegularExpressionMatch attrMatch = attrIt.next(); QString attrName = attrMatch.captured(1); QString attrValue = attrMatch.captured(2); // 跳过已加引号的属性 if (attrValue.startsWith("\"") || attrValue.startsWith("'")) continue; QString replacement = attrName + "=\"" + attrValue + "\""; fixedAttrs.replace(attrMatch.capturedStart() + attrOffset, attrMatch.capturedLength(), replacement); attrOffset += replacement.length() - attrMatch.capturedLength(); } result.append("&lt;" + slash + tag + fixedAttrs + "&gt;"); pos = match.capturedEnd(); } // 添加剩余内容 if (pos &lt; normalized.size()) { result.append(normalized.mid(pos)); } // 6. 后处理清理 result.replace("°", "°"); // 温度符号修复 result.replace("&lt;/link&gt;", ""); // 移除残余闭合标签 // 7. 确保根元素存在(针对某些HTML文档缺少根元素的情况) if (!result.contains("&lt;html&gt;")) { result = "&lt;html&gt;" + result + "&lt;/html&gt;"; } return result; // 2. 移除DOCTYPE声明 QString normalized = html; QRegularExpression doctypeRegex("&lt;!DOCTYPE[^&gt;]*&gt;"); normalized.replace(doctypeRegex, "");导致最后输出的字符串在第一行和第二行中间有一行空行导致setCont失败
最新发布
08-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虎眼豆丁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值