DOCTYPE不可怕,但把它拿走,会让你怕了又怕

本文详细介绍了DOCTYPE的概念、规则及其在XHTML文档中的重要性。通过对比三种不同的DTD(文档类型定义),帮助读者理解如何选择合适的DOCTYPE以确保网页正确显示。

DOCTYPE不可怕,但把它拿走,会让你怕了又怕。

最近在蓝色理想转悠,发现很多朋友提出有关DIV+CSS排版问题,以及IE与FF的兼容问题。怎么问的都有,结果就是一个——显示很奇怪,很难调整。我们浏览的大多数网站,或者用Dreamweaver创建一个新的网页文档时,源码的顶部都会有DocType声明,但是很多人没有注意它,甚至在创作时候直接将它删掉,其实这往往就是噩梦的开始。在遵循标准的任何Web文档中,DOCTYPE都是一项必需的元素。它会影响代码验证,并决定了浏览器最终如何显示你的web文档。为了避免DOCTYPE的问题重复出现,我根据手头的资料整理了这篇文档,以备自己及有兴趣的朋友参考。

在默认情况下,FF和IE的解释标准是不一样的,也就是说,如果一个网页没有声明DOCTYPE,它就会以默认的DOCTYPE解释下面的HTML。在同一种标准下,不同浏览器的解释模型都有所差异,如果声明标准不同,不用我说,您自己想就可以了。学习网页标准,浏览器兼容,从哪里开始您自己决定,但是,请认识DOCTYPE:

一、什么是DOCTYPE

DOCTYPE是Document Type(文档类型)的简写,在页面中,用来指定页面所使用的XHTML(或者HTML)的版本。要想制作符合标准的页面,一个必不可少的关键组成部分就是DOCTYPE声明。只有确定了一个正确的DOCTYPE,XHTML里的标识和CSS才能正常生效。

二、DOCTYPE的规则

DOCTYPE声明的写法遵循一定的规则,它指出阅读程序应该用什么规则集来解释文档中的标记。在Web文档的情况下,“阅读程序”通常是浏览器或者校验器这样的一个程序,“规则”则是w3c所发布的一个文档类型定义(dtd)中包含的规则。
每个dtd都包括标记、attributes、properties等内容,它们用于标记web文档的内容;此外还包括一些规则,它们规定了哪些标记能出现在其他哪些标记中。每个web建议标准(比如html 4 frameset和xhtml 1.0 transitional)都有自己的dtd。

以下是从手册上摘抄的规则:

语法:

HTML  顶级元素  可用性 "注册//组织//类型 标签//定义  语言""URL"

可能值:

- 顶级元素:指定 DTD 中声明的顶级元素类型。这与声明的 SGML 文档类型相对应。 HTML 默认。HTML。 
- 可用性:指定正式公开标识符(FPI)是可公开访问的对象还是系统资源。 PUBLIC 默认。可公开访问的对象。SYSTEM 系统资源,如本地文件或 URL。 
- 注册:指定组织是否由国际标准化组织(ISO)注册。 + 默认。组织名称已注册。 
- 组织名称未注册。Internet 工程任务组(IETF)和万维网协会(W3C)并非注册的 ISO 组织。 
组织:指定表明负责由 !DOCTYPE 声明引用的 DTD 的创建和维护的团体或组织的名称,即 OwnderID。 IETF IETF。 W3C W3C。 
- 类型:指定公开文本类,即所引用的对象类型。 DTD 默认。DTD。 
- 标签:指定公开文本描述,即对所引用的公开文本的唯一描述性名称。后面可附带版本号。 HTML 默认。HTML。 
- 定义:指定文档类型定义。 
  Frameset 框架集文档。 
  Strict 排除所有 W3C 专家希望逐步淘汰的代表性属性和元素,因为样式表已经很完善了。 
  Transitional 包含除 frameSet 元素的全部内容。 
- 语言:指定公开文本语言,即用于创建所引用对象的自然语言编码系统。该语言定义已编写为 ISO 639  语言代码(大写两个字母)。 EN 默认。英语。 
- URL:指定所引用对象的位置

为了获得正确的DOCTYPE声明,关键就是让dtd与文档所遵循的标准对应。例如,假定文档遵循的是xhtml 1.0 strict标准,文档的doctype声明就应该引用相应的dtd。另一方面,如果doctype声明指定的是xhtml dtd,但文档包含的是旧式风格的html标记,就是不恰当的;类似地,如果doctype声明指定的是html dtd,但文档包含的是xhtml 1.0 strict标记,同样是不恰当的。

三、选择什么样的DOCTYPE

如上例所示,XHTML 1.0中有3种DTD(文档类型定义)声明可以选择:过渡的(Transitional)、严格的(Strict)和框架的(Frameset)。这里分别介绍如下。

1.过渡的

一种要求不很严格的DTD,允许在页面中使用HTML4.01的标识(符合xhtml语法标准)。过渡的DTD的写法如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

2.严格的

一种要求严格的DTD,不允许使用任何表现层的标识和属性,例如<br/>等。严格的DTD的写法如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

3.框架的

一种专门针对框架页面所使用的DTD,当页面中含有框架元素时,就要采用这种DTD。框架的DTD的写法如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

使用严格的DTD来制作页面,当然是最理想的方式。但是,对于没有深入了解Web标准的网页设计者,比较合适的是使用过渡的DTD。因为这种DTD还允许使用表现层的标识、元素和属性,比较适合大多数网页制作人员。

四、需要注意的问题

没什么特别的,就是一定要将DOCTYPE声明放在XHTML文档的顶部,上面哪怕多个HTML注释标记都不行。

最好示例代码也加上DOCTYPE,否则效果会有差异。

 

转自http://bbs.blueidea.com/thread-2792311-1-1.html

 

<think>好的,我现在需要解决用户的问题:如何在Qt的QTextEdit中设置toHtml()包含DOCTYPE标签。首先,我得回忆一下QTextEdit的相关知识。用户提到使用toHtml()方法生成的HTML包含DOCTYPE声明,而他们希望去除这个部分。 首先,我应该确认toHtml()的默认行为。根据Qt文档,QTextDocument的toHtml()方法确实会生成包含DOCTYPE和HTML标签的完整结构。用户可能只需要内部的内容,比如<body>里的部分,而需要外部的声明和标签。 接下来,我需要思考如何去掉这些标签。直接处理生成的HTML字符串可能是一个方法。比如,使用字符串操作或者正则表达式来删除DOCTYPE和外围的HTML标签。例如,可以查找"<html>"和"</html>"标签,并提取中间的内容,或者直接替换掉DOCTYPE声明过,需要考虑HTML的格式可能有变化,比如换行符或空格,这可能会影响正则表达式的准确性。因此,正则表达式需要足够灵活,或者分步骤处理:先去掉DOCTYPE行,再去掉<html>和<body>标签,保留内部内容。 另一个考虑是Qt版本是否有相关设置可以控制生成的HTML结构。查阅文档发现,可能没有直接的选项来禁用DOCTYPE,但可以检查QTextDocument的生成选项,比如通过setHtml()或相关方法,但似乎没有这样的参数。因此,可能必须依赖后期处理字符串。 用户可能需要一个代码示例。例如,在调用toHtml()之后,使用QString的replace方法,用正则表达式匹配DOCTYPE行并替换为空。同样,处理<html>和<body>标签,但要注意保留内容。可能需要多次替换,或者使用更复杂的正则表达式来匹配并捕获所需部分。 还要注意,处理后的HTML是否会影响样式或结构。例如,如果原始内容依赖某些在DOCTYPE中定义的样式,去除后可能会有影响。但通常用户可能只需要内容部分,样式可能以内联方式存在,因此去除外层标签会有问题。 最后,验证这个方法是否有效。编写一个简单的例子,生成带DOCTYPE的HTML,应用替换,检查结果是否如预期。可能需要测试同的Qt版本,确保兼容性。另外,提醒用户注意正则表达式的写法,避免贪婪匹配或遗漏某些情况。</think>在Qt中,使用`QTextEdit`的`toHtml()`方法生成HTML时,默认会包含DOCTYPE声明和完整的HTML标签结构。若需要去除DOCTYPE标签,可以按以下步骤操作: --- ### **解决方法** 1. **获取原始HTML字符串** ```cpp QString html = textEdit->toHtml(); ``` 2. **使用正则表达式移除DOCTYPE标签** ```cpp // 移除<!DOCTYPE...>标签 html.remove(QRegularExpression("<!DOCTYPE[^>]*>")); // 可选:移除<html>和<body>标签(保留内容) html.replace(QRegularExpression("<html[^>]*>"), ""); html.replace(QRegularExpression("</html>"), ""); html.replace(QRegularExpression("<body[^>]*>"), ""); html.replace(QRegularExpression("</body>"), ""); ``` 3. **最终结果示例** ```html <!-- 原始输出 --> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html> <head>...</head> <body>...</body> </html> <!-- 处理后 --> <head>...</head> ... ``` --- ### **注意事项** - **正则表达式匹配**:确保正则表达式精准匹配目标标签,避免误删内容。 - **Qt版本兼容性**:此方法在Qt 5.x及6.x中均适用。 - **样式保留**:移除DOCTYPE后,某些浏览器可能切换渲染模式,但对大多数富文本内容影响较小。 --- ### **完整代码示例** ```cpp QString getCleanHtml(QTextEdit *textEdit) { QString html = textEdit->toHtml(); // 移除DOCTYPE html.remove(QRegularExpression("<!DOCTYPE[^>]*>")); // 移除<html>和<body>标签 html.replace(QRegularExpression("<html[^>]*>"), ""); html.replace(QRegularExpression("</html>"), ""); html.replace(QRegularExpression("<body[^>]*>"), ""); html.replace(QRegularExpression("</body>"), ""); return html; } ``` 通过此方法,可有效去除`toHtml()`生成的冗余标签。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值